题目链接
思想
基本没有什么思想,输入有些小坑。一定要考虑到如果密码本合法,则26个字母每个字母都要能够解密。再注意一下多个明文对应一个暗文的情况即可(本文用了一个校验数组)
代码及注释
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
string a,b,c;
map<char,char> mp;
vector<char> ans;
int test[150]; //这里是一个校验数组,用来检查是否有多个明文对应一个暗文
int main(){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
cin>>a>>b>>c; //输入有坑,每行最后一个字符是空格,所以不能用直接getline,这里为了方便用来cin,其实一般还是习惯用getline
int failed=0; //注意这里用了一个failed来进行标记成败
memset(test,0,sizeof(test));
int len=a.length();
for(int i=0;i<len;i++){
if(!mp.count(a[i])) {
mp[a[i]]=b[i];
}
else{
if(mp[a[i]]!=b[i]){
failed=1;
break;
}
}
}
len=c.length();
if(mp.size()<26) failed=1;
for(char i='A';i<='Z';i++){
test[mp[i]]++;
}
for(char i='A';i<='Z';i++){
if(!test[i]){
failed=1;
break;
}
}
for(int i=0;i<len;i++){
if(mp.count(c[i])) ans.push_back(mp[c[i]]); //不着急输出,先把答案存起来,如果failed不为1再一块输出
else{
failed=1;
break;
}
}
if(failed) cout<<"Failed";
else{
for(vector<char>::iterator it=ans.begin();it!=ans.end();it++) //这里练习一下迭代器,也完全可以不用迭代器
cout<<*it;
}
return 0;
}
作者
Bowen
本题所有题解、代码及注释均为作者原创,转载请注明出处。
本文作者水平有限,若有纰漏之处,敬请斧正。
欢迎大家一起学习交流。