这居然是用并查集写,这谁能想到呀
题意:
思路:
本质上是去分析为什么经过操作之后步数会减少
事实上对于下面这个例子来说,a->b,b->c就不需要走a->c这条边了,因此步数减少了
这用并查集就能维护
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mxn=1e5+10;
const int mxe=1e5+10;
string s,t;
int N,ans=0;
int f[mxn];
int find(int x){
return f[x]=(x==f[x])?x:find(f[x]);
}
void join(int u,int v){
int f1=find(u),f2=find(v);
if(f1!=f2) f[f1]=f2,ans++;
}
void solve(){
s.clear();
t.clear();
ans=0;
for(int i=1;i<=26;i++) f[i]=i;
cin>>N>>s>>t;
s=" "+s;
t=" "+t;
for(int i=1;i<=N;i++){
if(s[i]>t[i]){
cout<<-1<<'\n';
return;
}
join(s[i]-'a'+1,t[i]-'a'+1);
}
cout<<ans<<'\n';
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;cin>>__;
while(__--)solve();return 0;
}