描述
16 世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法――Vigenère密码。Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。
在密码学中,我们称需要加密的信息为明文,用 M 表示;称加密后的信息为密文,用C 表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为k。 在Vigenère密码中, 密钥k是一个字母串, k=k1k2…kn。当明文M=m1m2…mn时,得到的密文C=c1c2…cn,其中ci=mi®ki,运算®的规则如下表所示:
Vigenère加密在操作时需要注意:
- ®运算忽略参与运算的字母的大小写,并保持字母在明文 M中的大小写形式;
- 当明文M的长度大于密钥k的长度时,将密钥k 重复使用。
例如,明文M=Helloworld,密钥k=abc时,密文C=Hfnlpyosnd。
明文 Helloworld
密钥 abcabcabca
密文 Hfnlpyosnd
输入
输入共2行。
第一行为一个字符串,表示密钥k,长度不超过100,其中仅包含大小写字母。第二行为一个字符串,表示经加密后的密文,长度不超过1000,其中仅包含大小写字母。
对于100%的数据,输入的密钥的长度不超过100,输入的密文的长度不超过1000,且都仅包含英文字母。
输出
输出共1行,一个字符串,表示输入密钥和密文所对应的明文。
样例输入
CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm
样例输出
Wherethereisawillthereisaway
题目来源
NOIP2012 提高组 DAY1
浅析
用最暴力的方法,但给出来的表的值,来查找对于的值,刚好反的,所以要新造个表,如果查找可能会超时,运行错误,不知道为啥。。。要么都大写,要么都小写,随便都可以啦!
//#include <bits/stdc++.h>
#include <stdio.h>
#include <string.h>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
bool k[1005];
char a[27][27] ={
{"abcdefghijklmnopqrstuvwxyz"},
{"zabcdefghijklmnopqrstuvwxy"},
{"yzabcdefghijklmnopqrstuvwx"},
{"xyzabcdefghijklmnopqrstuvw"},
{"wxyzabcdefghijklmnopqrstuv"},
{"vwxyzabcdefghijklmnopqrstu"},
{"uvwxyzabcdefghijklmnopqrst"},
{"tuvwxyzabcdefghijklmnopqrs"},
{"stuvwxyzabcdefghijklmnopqr"},
{"rstuvwxyzabcdefghijklmnopq"},
{"qrstuvwxyzabcdefghijklmnop"},
{"pqrstuvwxyzabcdefghijklmno"},
{"opqrstuvwxyzabcdefghijklmn"},
{"nopqrstuvwxyzabcdefghijklm"},
{"mnopqrstuvwxyzabcdefghijkl"},
{"lmnopqrstuvwxyzabcdefghijk"},
{"klmnopqrstuvwxyzabcdefghij"},
{"jklmnopqrstuvwxyzabcdefghi"},
{"ijklmnopqrstuvwxyzabcdefgh"},
{"hijklmnopqrstuvwxyzabcdefg"},
{"ghijklmnopqrstuvwxyzabcdef"},
{"fghijklmnopqrstuvwxyzabcde"},
{"efghijklmnopqrstuvwxyzabcd"},
{"defghijklmnopqrstuvwxyzabc"},
{"cdefghijklmnopqrstuvwxyzab"},
{"bcdefghijklmnopqrstuvwxyza"},
};
int main()
{
ios::sync_with_stdio(false);
string s,ss;
cin>>s>>ss;
int len1 = ss.size(),len2 = s.size();
for(int i = 0;i < len1;i ++)
{
if(ss[i] >= 'A' && ss[i] <= 'Z')
{
ss[i] = ss[i] - 'A' + 'a';
k[i] = 1;
}
}
for(int i = 0;i < len2;i ++)
{
if(s[i] >= 'A' && s[i] <= 'Z')
{
s[i] = s[i] - 'A' + 'a';
}
}
for(int i = 0;i < len1;i ++)
{
int sp = i %len2;
int a1 = ss[i] - 'a';
int a2 = s[sp] - 'a';
if(k[i] == 1)
{
cout<<char(a[a2][a1] - 'a' + 'A');
}
else
{
cout<<a[a2][a1];
}
}
cout<<"\n";
return 0;
}
随便写写,啦啦啦!!!