本题
模拟
即可
按照题目的判断方法:
- 所有信息扫描完毕,‘A’-‘Z’ 所有 26 个字母在原信息中均出现过并获得了相应的“密字”。
这个做两次:一次原信息,一次加密过的信息
for(int i=1; i<=27; i++)
if(a2[i]==0) //如果有一个字母没有
{
cout<<"Failed";
return 0;
}
2.原信息和加密过的信息长度不一样
if(strlen(a)!=strlen(b))
{
cout<<"Failed";
return 0;
}
- 扫描中发现掌握的信息里有明显的自相矛盾或错误(违反S 国密码的编码规则)。例如某条信息“XYZ”被翻译为“ABA”就违反了“不同字母对应不同密字”的规则。
注意:这个要做两次,一次是原信息,一次是加密过的信息
原信息的:
for(int i=1; i<=strlen(b+1); i++)
if(b2[b[i]-64]==0)
b2[b[i]-64]=a[i];
加密过的:
for(int i=1; i<=strlen(a+1); i++)
if(a2[a[i]-64]==0) //储存原来的
a2[a[i]-64]=b[i];
else if(a2[a[i]-64]!=b[i]) //原来和这次不一样
{
cout<<"Failed";
return 0;
}
我这样讲可能有点不清楚,那就综合起来吧!
A C C o d e AC~Code AC Code
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
char a[1010],a2[1010],b[1010],b2[1010],c[1010];
int main()
{
freopen("spy.in","r",stdin);
freopen("spy.out","w",stdout);
gets(a+1);gets(b+1);gets(c+1);
if(strlen(a)!=strlen(b))
{
cout<<"Failed";
return 0;
}
for(int i=1; i<=strlen(a+1); i++)
if(a2[a[i]-64]==0) //储存原来的
a2[a[i]-64]=b[i];
else if(a2[a[i]-64]!=b[i]) //原来和这次不一样
{
cout<<"Failed";
return 0;
}
for(int i=1; i<=27; i++)
if(a2[i]==0) //如果有一个字母没有
{
cout<<"Failed";
return 0;
}
for(int i=1; i<=strlen(b+1); i++)
if(b2[b[i]-64]==0)
b2[b[i]-64]=a[i];
for(int i=1; i<=27; i++)
if(b2[i]==0) //同上
{
cout<<"Failed";
return 0;
}
for(int i=1; i<=strlen(c+1); i++)
cout<<a2[c[i]-64];
return 0;
}