先生与加密
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 396 Solved: 255
[Submit][Status][Web Board]
Description
L先生最近想给暗恋的同班女神Z写一封情书,但是需要经过同学A、B、C、D、E、F、G转交,为了保证情书内容不被公之于众(否则后果,你懂的),他决定采用高大上的维吉尼亚加密。
那么,问题来了,L先生的C语言是挂科的,所以代码写不出来,笔算内容又太多,感到很无助,你能帮助他吗?
Input
多组测试例,处理到文件结束。(测试例数量<5)
每行有两个字符串,之间用空格隔开,分别为明文a和密钥b。输入字符全都为小写。(字符串长度<=50)
Output
每个加密结果占一行。输出字符全都小写。
Sample Input
datasecurity best
Sample Output
eelttiunsmlr
HINT
维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。假如对如下明文加密:
TO BE OR NOT TO BE THAT IS THE QUESTION
当选定RELATIONS作为密钥时,加密过程是:明文一个字母为T,第一个密钥字母为R,因此可以找到在R行中代替T的为K,依此类推,得出对应关系如下:
密钥:RELAT IONSR ELATI ONSRE LATIO NSREL
明文:TOBEO RNOTT OBETH ATIST HEQUE STION
密文:KSMEH ZBBLK SMEMP OGAJX SEJCS FLZSY
首先必须要 理解题中说的 在R行中代替T的为K ,这句话啥意思,
其实就是
ABCD…..Z
BCDE……A
CDEF…….B
.
.
ZABC……Y
就是这个表,当时想了半天才觉得只能是这样,正好对题意
之后很简单了,可以打个表
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 10000+10
#define MAXM 1000000+10
using namespace std;
int biao[26][26];
void dabiao()
{
for(int i=0;i<26;i++)
{
for(int j=0;j<26;j++)
{
biao[i][j]=(i+j)%26;
}
}
/*for(int i=0;i<26;i++)
{
for(int j=0;j<26;j++)
{
printf("%c ",biao[i][j]+'a');
}
putchar('\n');
}*/
}
int main()
{
dabiao();
char s[100],ss[100];
while(scanf("%s %s",s,ss)!=EOF)
{
int a=strlen(s);
int b=strlen(ss);
char str[100];
if(b<a)
{
int i,j=0;
for(i=0;i<a;i++)
{
if(j==b) j=0;
str[i]=ss[j],j++;
}
}
else for(int i=0;i<b;i++) str[i]=ss[i];
for(int i=0;i<a;i++)
{
printf("%c",biao[str[i]-'a'][s[i]-'a']+'a');
}
putchar('\n');
}
return 0;
}