CodeForces 1263 D.Secret Passwords (并查集)

题意:

给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;
}
发布了364 篇原创文章 · 获赞 26 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/103333328