翻译密码
Posted wang者归来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了翻译密码相关的知识,希望对你有一定的参考价值。
【问题背景】 zhx 和他的妹子聊天。 【问题描述】 考虑一种简单的加密算法。 假定所有句子都由小写英文字母构成,对于每一个字母,我们将它唯一地映 射到另一个字母。例如考虑映射规则: a->b, b->c, c->d, d->a. 那么单词 bad 就会被映射为 cba。这个映射规则的“逆 映射规则”为: b->a, c->b, d->c, a->d。 对于密文 cba, 我们很容易将它解密为 bad。 当然,这样的映射需要保证每一个字母映射到的字母是不同的(即不可以出 现两个不同的字母映射到同一个字母,否则将会无法解密) 。 一种常见的密码攻击方式被称为已知明文攻击。具体地,在你不知道映射表 的情况下,给你一段明文和对应的密文,你可以推导出一些的映射规则,下一次 你收到一条密文,你就可能可以解密它。现在你需要完成这样的一个系统。 【输入格式】 第一行包含一个字符串,仅包含小写字母,表示一段明文。 第二行包含一个字符串,仅包含小写字母,表示这段明文对应的密文,保证 两行长度相同。 第三行包含一个字符串,仅包含小写字母,表示你需要解密的密文。 【输出格式】 输出共一行,表示输入中第三行密文对应的明文。如果不能解密,输出 “ERROR”(不包含引号) 。注意输入可能出现不自恰的情况。 【样例输入】 ab cc cc 【样例输出】 ERROR 【样例输入】 ab ab c 【样例输出】 ERROR 【样例输入】 abcde bcdea cad 【样例输出】 bec 【数据范围与规定】 对于100%的数据,所有字符串长度<=1000。
考虑共有26个字母,知道25个之后最后一个也就知道了。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> #include<queue> #include<math.h> using namespace std; char a[1010],b[1010],c[1010],d[1010]; int f[30],len1,len2,x,y; int vis[30],yy,tot,xx; int main() { freopen("enc.in","r",stdin); freopen("enc.ans","w",stdout); cin>>(a+1)>>(b+1)>>(c+1); len1=strlen(a+1); for(int i=1;i<=len1;i++) { x=b[i]-‘a‘+1; y=a[i]-‘a‘+1; if(f[x]&&f[x]!=y) { cout<<"ERROR"; return 0; } f[x]=y;vis[y]=1; } for(int i=1;i<=26;i++) if(!vis[i]) tot++,yy=i; if(tot==1) { tot=0; for(int i=1;i<=26;i++) if(!f[i]) tot++,xx=i; if(tot==1) f[xx]=yy; } len2=strlen(c+1); for(int i=1;i<=len2;i++) { x=c[i]-‘a‘+1; if((!f[x])) { cout<<"ERROR"; return 0; } d[i]=‘a‘+f[x]-1; } for(int i=1;i<=len2;i++) cout<<d[i]; return 0; }
以上是关于翻译密码的主要内容,如果未能解决你的问题,请参考以下文章
修改MySQL密码报错“ERROR 1819 (HY000): Your password does not satisfy the current policy requirements“(代码片段
Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段
NC41 最长无重复子数组/NC133链表的奇偶重排/NC116把数字翻译成字符串/NC135 股票交易的最大收益/NC126换钱的最少货币数/NC45实现二叉树先序,中序和后序遍历(递归)(代码片段