题面:
题目大意:
santa把键盘的一些键位装反了,所以他按下记忆中正确的键位时会输出另一个字符,现在问你能不能通过交换键位把键盘装好,如果可以输出需要交换的个数和需要交换的字符,否则输出-1
数据范围:
两个输入字符串长度不大于1000
解题思路:
模拟题。
易错的地方主要是找不全不能修复的情况,一共四种
aa ab
ab aa
ab cb
ab bc
当出现这些情况时,直接输出-1,
代码排版不知道怎么抽风了,还得手排。。。将就看。
#include <stdio.h>
#include <string.h>
char s[1010];
char t[1010];
struct ex{
char a;
char b;
}N[1010];
int q = 0;
bool c(void)
{
int l = strlen(s);
for(int i = 0;i<l;i++)
{
N[q].a = s[i];
N[q].b = t[i];
if(s[i]!=t[i])q++;
for(int j = i+1;j<l;j++)
if(s[i] == s[j] && t[i] == t[j])//相同形式a->b a->b
t[j] = s[j];
else if(s[i] == t[j] && t[i] == s[j])//翻转形式 a->b b->a
s[j] = t[j];
else if(s[i] == s[j] && t[i] != t[j])//aa ab
return 0;
else if(s[i] == t[j] && t[i] != s[j])//ab aa
return 0;
else if(t[i] == t[j] && s[i] != s[j])//ab cb
return 0;
else if(t[i] == s[j] && s[i] != t[j])//ab bc
return 0;
s[i] = t[i];
}
return 1;
}
int main()
{
scanf("%s",s);
scanf("%s",t);
if(!strcmp(s,t))
printf("0");
else
{
if(c())
{
printf("%d\n",q);
for(int i = 0;i<q;i++)
printf("%c %c\n",N[i].a,N[i].b);
}
else printf("-1");
}
}