https://new.npuacm.info/statistics
查刷题数
上一次未访问 last[s[j]-‘a’] 值改为pos
上一次访问过 合并 此点的根加到上一次的根
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
const ll mod=1e9+7;
const int INF=0x3f3f3f3f;
#define IO ios::sync_with_stdio(false);cin.tie(0);
ll T;
ll n,m,minn,maxx,cnt,sum,ans;
ll a[maxn],pre[maxn],last[30];
string s;
ll find(ll x){
return pre[x]==x?x:pre[x]=find(pre[x]);
}
int main(){
IO;
cin>>n;
for(int i=1;i<=n;i++){
pre[i]=i;
}
for(int i=1;i<=n;i++){
cin>>s;
ll len=s.size();
for(int j=0;j<len;j++){
if(last[s[j]-'a']){
ll u=find(i);
ll v=find(last[s[j]-'a']); //上一次出现位置的根
pre[u]=v;
}
last[s[j]-'a']=i; //下一次的上一次
}
}
for(int i=1;i<=n;i++){
if(i==pre[i])
ans++;
}
cout<<ans<<endl;
return 0;
}