Love Rescue CodeForces - 939D

本文探讨如何使用最小生成树解决字符串匹配问题,通过构建图模型并利用最小代价连通图来实现字符串间的最优转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值