A. String Transformation 1

原题链接

题解

\(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;
}

posted @ 2024-03-17 21:26  纯粹的  阅读(36)  评论(0)    收藏  举报