题目链接:
http://codeforces.com/problemset/problem/748/B
题解:
题目大意:
给出两个字符串,两个字符串中,会有一些字符出现映射,比如h->e,e - >h(只能对应一个,不能对应多个),请你输出满足条件的数量,以及字母和它的对应字母。
用map来做,直接用数组的话可能比较麻烦,用map看起来比较的简洁,详细看代码。
代码:
#include <cstdio>
#include <map>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define met(a,b) memset(a,b,sizeof(a))
const int maxn = 1e3+10;
#define inf 0x3f3f3f3f
map<char,int> mp1,mp2;
map<char,char> dic;
vector<pair<char,char>> ans;
char s1[maxn],s2[maxn];
void draw()
{
cout<<-1<<endl;
exit(0);
}
int main()
{
scanf("%s",s1);
scanf("%s",s2);
int length=strlen(s1);
for(int i=0;i<length;i++)
{
if(!mp1[s1[i]])
{
mp1[s1[i]]=1;
dic[s1[i]]=s2[i];
if(mp1[s2[i]]==1)
{
if(dic[s2[i]]!=s1[i])
draw();
}
else
{
mp1[s2[i]]=1;
dic[s2[i]]=s1[i];
}
}
else
{
if(dic[s2[i]]!=s1[i]||dic[s1[i]]!=s2[i])
draw();
}
}
for(char i='a';i<='z';i++)
if(mp1[i]!=0)
if(dic[i]!=i&&!mp2[i]&&!mp2[dic[i]])
{
ans.push_back({i,dic[i]});
mp2[i]=mp2[dic[i]]=1;
}
cout<<ans.size()<<endl;
for(int i=0;i<ans.size();i++)
cout<<ans[i].first<<" "<<ans[i].second<<endl;
}