字符串-洛谷P1070潜伏者 题解

题目链接

题目戳这里

思想

基本没有什么思想,输入有些小坑。一定要考虑到如果密码本合法,则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
本题所有题解、代码及注释均为作者原创,转载请注明出处。
本文作者水平有限,若有纰漏之处,敬请斧正。
欢迎大家一起学习交流。

发布了50 篇原创文章 · 获赞 7 · 访问量 1154

猜你喜欢

转载自blog.csdn.net/numb_ac/article/details/103094414