【 问题背景】
zhx 和他的妹子聊天。
【 问题描述】
考虑一种简单的加密算法。
假定所有句子都由小写英文字母构成,对于每一个字母,我们将它唯一地映射到另一个字母。例如考虑映射规则:
a->b,b->c,c->d,d->a.那么单词 bad 就会被映射为 cba。这个映射规则的“逆映射规则”为:b->a, c->b,d->c,a->d。对于密文cba,我们很容易将它解密为bad。
当然,这样的映射需要保证每一个字母映射到的字母是不同的(即不可以出现两个不同的字母映射到同一个字母,否则将会无法解密)。
一种常见的密码攻击方式被称为已知明文攻击。具体地,在你不知道映射表的情况下,给你一段明文和对应的密文,你可以推导出一些的映射规则,下一次你收到一条密文,你就可能可以解密它。现在你需要完成这样的一个系统。【输入格式】
第一行包含一个字符串, 仅包含小写字母, 表示一段明文。
第二行包含一个字符串, 仅包含小写字母, 表示这段明文对应的密文, 保证两行长度相同。
第三行包含一个字符串,仅包含小写字母, 表示你需要解密的密文。【输出格式】
输出共一行, 表示输入中第三行密文对应的明文。 如果不能解密, 输出“ERROR”(不包含引号)。注意输入可能出现不自恰的情况。
【样例输入】
ab
cc
ccab
ab
cabcde
bcdea
cad【样例输出】
ERROR
ERROR
bec【数据范围与规定】
对于100%的数据, 所有字符串长度<=1000。
首先,显然这是一个非常裸的模拟题,就是注意一下给出了25个字母的密文余下一个字母也就能解密的情况,以及处理不自洽。but,作为一个智障呢,我的q数组越界篡改了我的b数组,所以拿了一个奇奇怪怪的分数,50。btw,出题人很良心,输出ERROE有30分哦。
#include<cstdio> #include<cstring> char a[30]; bool q[30]; char b[1010]; char d[1010]; char j[1010]; char ans[1010]; int main() { // freopen("enc.in","r",stdin); // freopen("enc.out","w",stdout); int sum=0; scanf("%s\n%s",b,d); memset(a,‘0‘,sizeof(a)); memset(q,0,sizeof(q)); int len=strlen(b); for(int i=0;i<len;++i) { //printf("%s %s\n",b,d); int t=d[i]-‘a‘; if(a[t]!=‘0‘&&a[t]!=b[i]) { printf("ERROR"); return 0; } if(a[t]==‘0‘) { ++sum; q[b[i]-‘a‘]=true;//就是这里傻子写了一个-‘0’ } a[t]=b[i]; } if(sum==25) { int x,y; for(int i=0;i<26;++i) { if(a[i]==‘0‘) { x=i; break; } } for(int i=0;i<26;++i) { if(!q[i]) y=i; } a[x]=y+‘a‘; } scanf("%s",j); len=strlen(j); for(int i=0;i<len;++i) { if(a[j[i]-‘a‘]==‘0‘) { printf("ERROR"); return 0; } else ans[i]=a[j[i]-‘a‘]; } for(int i=0;i<len;++i) printf("%c",ans[i]); printf("\n"); return 0; }
原文:http://www.cnblogs.com/wykjx1314/p/7680013.html