ACM集训之入门训练赛一: 模拟题/字符串处理 CF 748-B

版权声明:本文为博主原创文章,转载请注明出自CSDN Authur_gyc https://blog.csdn.net/WHY995987477/article/details/88585602

Codeforces 748B-Santa Claus and Keyboard Check
洛谷上的链接:https://www.luogu.org/problemnew/show/CF748B

题意

有人的键盘坏了,他用他的键盘打了一串字母,然后问你,如果这些字母只能和另一个字母组成一对,问能不能通过这些成对的交换把键盘修好。(说的有点蹩脚,建议看原题目)

思路

我的做法关键在于两个字母进行关系的配对,以及判断这两个字母有没有字母“出轨”。

判断是否初始化,如果都没有初始化那么执行初始化操作 
如果其中一个初始化了,另一个没有,那么答案一定是错误,输出-1 
如果两个都初始化了,那要判断是否存的是彼此的下标,如果不是,输出-1 
以及是否有其他的东西要覆盖初始化 

代码

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
char a[1005],b[1005];
int ans[256];
int main()
{	
	memset(ans,0,sizeof(ans));
	scanf("%s%s",&a,&b);
	int n=strlen(a),cnt=0;
	for(int i=0;i<n;i++)
	{
		int pos1=a[i],pos2=b[i];
		if(ans[pos1]==0&&ans[pos2]==0){	
			ans[pos1]=pos2;
			ans[pos2]=pos1; 
		}
		else if((ans[pos1]!=0&&ans[pos2]==0)||(ans[pos1]==0&&ans[pos2]!=0))
			return printf("-1\n")*0;
		else
			if(ans[pos1]==pos2&&ans[pos2]==pos1);
			else
				return printf("-1\n")*0;	
	}
	for(int i=0;i<256;i++)
		if(ans[i]!=0&&ans[i]!=i&&i==ans[ans[i]])
			cnt++; 	
	printf("%d\n",cnt/2);
	for(int i=0;i<256;i++)
		if(ans[i]!=0&&ans[i]!=i&&i==ans[ans[i]])
		{
			printf("%c %c\n",i,ans[i]);
			ans[ans[i]]=0;
		}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/WHY995987477/article/details/88585602
今日推荐