思路:并查集
读入数据,题目中要求对字符串 A 中字母进行变换,使其与字符串 B 相同。
首先我们可以知道,如果字母 a 可以转换成字母 b,字母 b 可以转换成字母 c ,那么字母 a 可以转换成字母 c 。
啊,并查集find()
的气息。
那么我们只需要遍历一遍两个字符串,如果两个字符串当前位置的字符不在一个集合内,那么把它们合并到一个集合里,并且记录答案,最后输出记录了几次答案以及记录的答案就能过掉这个题了。
Codeing Time
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
const int N=100005;
int n,t;
char ans[N][2],a[N],b[N];
map<char,char> f;
char find(char x) {
if(f[x]!=x) f[x]=find(f[x]);
return f[x];
}
bool merge(char x,char y) {
x=find(x);
y=find(y);
if(x!=y) f[x]=y;
else return 0;
return 1;
}
int main() {
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(char i='a';i<='z';i++) f[i]=i;
for(int i=1;i<=n;i++) {
if(merge(a[i],b[i])) {
ans[++t][0]=b[i];
ans[t][1]=a[i];
}
}
cout<<t<<endl;
for(int i=1;i<=t;i++) cout<<ans[i][1]<<' '<<ans[i][0]<<endl;
return 0;
}
被黄学长拿来当考试题的题能不是好题吗