思路:
这题思考一下就可以知道是对二十六个字母使用并查集进行合并;
但是要注意区分没有出现过的字母;
代码:
#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;
}