题意:
给n个字符串,
如果两个字符串都含有某个字母,则这两个字符串等价
且如果字符串A和B等价,B和C等价,则A和C等价
n个串有多少种不等价的串
思路:
容易想到并查集,且假设串为abc,则含abc字符的串肯定在同一集合中
但如果对于每个串,O(n2)把串中含有的字母合并为一个集合,肯定超时
新开26个节点表示26个字母的集合
遍历每个串,将串合并到相应的字母集合里面就行了
code:
#include<bits/stdc++.h>
using namespace std;
const int maxm=2e6+5;
string s[maxm];
int pre[maxm];
int mark[maxm];
int ffind(int x){
return pre[x]==x?x:pre[x]=ffind(pre[x]);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin>>n;
for(int i=0;i<maxm;i++){
pre[i]=i;
}
for(int i=1;i<=n;i++){
cin>>s[i];
int len=s[i].size();
for(int j=0;j<len;j++){//遍历串
pre[ffind(i)]=ffind(n+s[i][j]-'a'+1);//合并到对应字母上
}
}
int ans=0;
for(int i=1;i<=n;i++){//计算答案
int x=ffind(i);
if(!mark[x]){
mark[x]=1;
ans++;
}
}
cout<<ans<<endl;
return 0;
}