CodeForces-1263D Secret Passwords 并查集 求连通分量
CodeForces-1263D Secret Passwords 并查集 求连通分量
题意
给定\(n\)个字符串,若两个不同的字符串中含相同的字符,就认为这两个字符串在一个集合中,问最终有几个集合
分析
看题意就很像是并查集问题,关键在于怎么维护并查集(建图)
容易想到至多有26个集合,不算大
不妨以字符串的第1个字符为根,字符串中其他字符向第1个字符连边
最后\(for\) 一遍统计连通分量即可,统计连通分量也很简单,判断祖先是自己的个数即可
代码
char s[maxn];
int vis[35];
int pre[35];
int cnt;
int Find(int x) {
    return pre[x] != x ? pre[x] = Find(pre[x]) : x;
}
void Union(int x, int y) {
    int p = Find(x), q = Find(y);
    if (p != q) pre[q] = p;
}
int main() {
    int n = readint();
    for (int i = 0; i <= 30; i++) pre[i] = i;
    for (int i = 0; i < n; i++) {
        scanf("%s", s);
        int len = strlen(s);
        vis[s[0] - 'a'] = 1;
        for (int j = 1; j < len; j++) vis[s[j] - 'a'] = 1, Union(s[j] - 'a', s[0] - 'a');
    }
    for (int i = 0; i < 30; i++) {
        if (vis[i] && pre[i] == i) cnt++;
    }
    printf("%d", cnt);
}

                
            
        
浙公网安备 33010602011771号