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);
}