Love Rescue CodeForces - 939D

http://codeforces.com/contest/939/problem/D

每次可以找一个字母对 (c1,c1) 以后这两个字符就可以随便相互转换 用最少的对数将两个字符串变得一样 且这些转换具有传递性

其实可以看做一个最小生成树 如果两字符串对应位置不相等 就当作在图上 有两个字符对应的点 两点之间有一条边 因为有传递性 所以我们要的就是用最小代价将图连通

#include <bits/stdc++.h>
using namespace std;

int f[50];
int n;
char ch1[100010],ch2[100010],u[50],v[50];

int getf(int p)
{
    if(f[p]==p) return p;
    else
    {
        f[p]=getf(f[p]);
        return f[p];
    }
}

bool unite(int u,int v)
{
    int fu,fv;
    fu=getf(u);
    fv=getf(v);
    if(fu!=fv)
    {
        f[fv]=fu;
        return true;
    }
    else return false;
}

int main()
{
    int i,ans;
    scanf("%d%s%s",&n,ch1,ch2);
    for(i=1;i<=26;i++) f[i]=i;
    ans=0;
    for(i=0;i<n;i++)
    {
        if(ch1[i]!=ch2[i])
        {
            if(unite(ch1[i]-'a'+1,ch2[i]-'a'+1))
            {
                ans++;
                u[ans]=ch1[i],v[ans]=ch2[i];
            }
        }
    }
    printf("%d\n",ans);
    for(i=1;i<=ans;i++) printf("%c %c\n",u[i],v[i]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sunyutian1998/article/details/82459952