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);
}
原文地址:https://www.cnblogs.com/hznumqf/p/13583673.html