A. String Transformation 1

原题链接

题解

ab,bc,ac 等价于 abc

az,bz 也可以等价于 abz 花费不变

所以是并查集,然后累积建边数量
如果 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 @   纯粹的  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示