Codeforces 1263D Secret Passwords(并查集)

思路:

这题思考一下就可以知道是对二十六个字母使用并查集进行合并;
但是要注意区分没有出现过的字母;

代码:

#include<bits/stdc++.h>
using namespace std;
const int MAX_N=26;
int par[MAX_N],rank_u[MAX_N];
void init_union(int n){
	for(int i=0;i<n;i++) par[i]=i,rank_u[i]=0;
}
int find(int x){
	if(par[x]==x) return x;
	else return par[x]=find(par[x]);
}
void unite(int x,int y){
	x=find(x); y=find(y);
	if(x==y) return;
	if(rank_u[x]<rank_u[y]) par[x]=y;
	else{
		par[y]=x;
		if(rank_u[x]==rank_u[y]) rank_u[x]++;
	}
}
bool flag[MAX_N];
int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	init_union(MAX_N);
	int n; cin>>n;
	while(n--){
		string s; cin>>s; flag[s[0]-'a']=true;
		for(int i=1;i<s.length();i++){
			unite(s[i]-'a',s[i-1]-'a');
			flag[s[i]-'a']=true;
		}
	}
	int ans=0;
	for(int i=0;i<MAX_N;i++) if(flag[i]&&par[i]==i) ans++;
	cout<<ans;
	return 0;
}
posted @ 2019-11-30 03:44  YuhanのBlog  阅读(102)  评论(0编辑  收藏  举报