题解 CF939D 【Love Rescue】

思路:并查集


读入数据,题目中要求对字符串 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;
}

被黄学长拿来当考试题的题能不是好题吗

posted @ 2020-05-09 14:32  ahawzlc  阅读(190)  评论(0编辑  收藏  举报