题目描述太多了就不复制了,大意是给s1和s2两个字符串,其中s1为被加密过的,s2为没被加密的原串。加密方式是原来字母被另一个字母所表示。用map表示很简单的。
然后再给一个字符串要你翻译解开。
题目要求是说,必须26个字母都有对应的解码,一个字母只能被一个字母所表示。不符合就翻译失败,符合就输出翻译结果。
上午洛谷随便专题抓的,,有个例子没过,手快按了数据下载x,又面向数据编程了,发现自己没有处理一个字母被两个字母表示的情况x,这个习惯问题很大,,尽量自己找bug,不要直接看数据
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N = 1e3+7; 5 char s1[N],s2[N],fina[N]; 6 map<char,char>mp,mmp; 7 int main(){ 8 ios::sync_with_stdio(0); 9 cin>>s1>>s2>>fina; 10 int l = strlen(s1); 11 for(int i = 0;i < l;++i){ 12 if(!mp[s1[i]]){ mp[s1[i]] = s2[i]; mmp[s2[i]] = s1[i];//x-y y-x 13 } 14 else if(mp[s1[i]]!=s2[i]){cout<<"Failed"<<endl;return 0;} 15 } 16 if(mp.size()<26||mmp.size()<26){cout<<"Failed"<<endl;return 0;}//查验有没有一个字母被两个映射了 17 int l2 = strlen(fina); 18 for(int i = 0;i < l2;++i){ 19 fina[i] = mp[fina[i]]; 20 } 21 cout<<fina<<endl; 22 }