弱省高二老年划水选手在此!!!!!!!!(目前已退役)

Ryan_

Every thing that kills me makes me feel alive.

CF939D Love Rescue

题目描述

给定两个长度为n的由小写字母组成的字符串
每次可以花费1的代价,指定两个字母,把其中一个全部变为另一个
求使两个字符串相同的最小花费
n <= 100000

输入输出样例

输入 #1
3
abb
dad

输出 #1

2
a d
b a

输入 #2

8
drpepper
cocacola

输出 #2

7
l e
e d
d c
c p
p o
o r
r a

解题思路

一开始自己没看懂题目,以为是对当前状态进行对应的修改,后来发现其实就是个并查集是捆绑修改的

AC Code

#include<bits/stdc++.h>
using namespace std;
int fa[30];
int find(int x) {
    if(fa[x]==x)return x;
    return fa[x]=find(fa[x]);
}
int sum;
char ans1[200],ans2[200];
char s1[100001],s2[100001];
int main() {
    int n;
    cin>>n;
    for(int i=1; i<=26; i++)fa[i]=i;
    for(int i=1; i<=n; i++) {
        cin>>s1[i];
    }
    for(int j=1; j<=n; j++) {
        cin>>s2[j];
    }
    for(int i=1; i<=n; i++) {
        int xx=find(s1[i]-'a'+1);
        int yy=find(s2[i]-'a'+1);
        if(xx!=yy) {
            sum++;
            ans1[sum]=s1[i];
            ans2[sum]=s2[i];
            fa[xx]=yy;
        }
    }
    cout<<sum<<endl;
    for(int i=1; i<=sum; i++) {
        printf("%c %c\n",ans1[i],ans2[i]);
    }
    return 0;
}

 

 

posted @ 2019-10-30 22:04  Ryan_zero  阅读(115)  评论(0编辑  收藏  举报