题解
\(a\to b,b\to c,a\to c\) 等价于 \(a\to b\to c\)
\(a\to z,b\to z\) 也可以等价于 \(a\to b\to z\) 花费不变
所以是并查集,然后累积建边数量
如果 \(finds(a)==finda(z)\) 代表 \(a\) 可以通过其他的变化也顺便变成 \(z\)
code
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int n;
map<int,int> fa;
int finds(int now)
{
return fa[now]==now?now:fa[now]=finds(fa[now]);
}
int check()
{
int ans=0;
for(int i=0;i<n;i++)
{
if(s1[i]<s2[i])
{
int f1=finds(s1[i]-'a'),f2=finds(s2[i]-'a');
if(f1!=f2) ans++;
fa[f1]=f2;
}
if(s1[i]>s2[i]) return -1;
}
return ans;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
for(int i=0;i<26;i++)fa[i]=i;
cin>>s1>>s2;
cout<<check()<<endl;
}
return 0;
}
标签:return,String,int,finds,fa,ans,now,Transformation
From: https://www.cnblogs.com/pure4knowledge/p/18079231