版权声明:本文为博主原创文章,转载请注明出自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;
}