【NOIP 2012】vigenere密码

描述

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-‘A‘+ki-‘A‘)mod26+‘A‘,运算?的规则如下表所示:
Vigenere加密在操作时需要注意: 
1. ?运算忽略参与运算的字母的大小写,并保持字母在明文M中的大小写形式; 
2. 当明文M的长度大于密钥k的长度时,将密钥k重复使用。

格式

输入格式

输入共2行。 
第一行为一个字符串,表示密钥k,长度不超过100,其中仅包含大小写字母。第二行为一个字符串,表示经加密后的密文,长度不超过1000,其中仅包含大小写字母。

输出格式

输出共1行,一个字符串,表示输入密钥和密文所对应的明文。

样例1

样例输入1

CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm

样例输出1

Wherethereisawillthereisaway

限制

每个测试点1s

提示

对于100%的数据,输入的密钥的长度不超过100,输入的密文的长度不超过1000,且都仅包含英文字母。

来源

Noip2012提高组复赛Day1T1

模拟秒之。。如果你要是跟我一样脑残的话那你调一个小时吧

#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;
char key[110],miwen[1010];
int keynum[110],mingwen[1010];
int lenkey,lenmiwen;
int main()
{
scanf("%s%s",key,miwen);
lenkey = strlen(key);
lenmiwen = strlen(miwen);
for(int i=0;i<lenkey;i++)
if(key[i] >=‘a‘ && key[i]<=‘z‘) keynum[i] = key[i] - ‘a‘;
else keynum[i] = key[i] - ‘A‘;
for(int i=0;i<lenmiwen;i++)
mingwen[i]=miwen[i]-keynum[i%lenkey];
for(int i=0;i<lenmiwen;i++)
if(isupper(miwen[i]))
{
if(mingwen[i]<‘A‘)mingwen[i]+=26;
printf("%c",mingwen[i]);
}
else
{
if(mingwen[i]<‘a‘)mingwen[i]+=26;
printf("%c",mingwen[i]);
}
puts("");
return 0;
}

时间: 2024-09-29 03:01:11

【NOIP 2012】vigenere密码的相关文章

【NOIP】提高组2012 vigenere密码

[算法]模拟 #include<cstdio> #include<cstring> const int maxm=1010; char sm[maxm],key[maxm],s[maxm]; int len,lenk; bool isbig(char c) {return c>='A'&&c<='Z';} int main() { scanf("%s",key);scanf("%s",sm); len=strlen

NOIP 2012 题解

[D1T1vigenere密码] P1778vigenere密码 Accepted 标签:[显示标签] 描述 16世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法--Vigenère密码.Vigenère密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用. 在密码学中,我们称需要加密的信息为明文,用M表示:称加密后的信息为密文,用C表示:而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为k. 在Vigenère

NOIP 2012 提高组 DAY1 T2 国王游戏

题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每 位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右 手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序, 使得获得奖赏最多的大臣,所获奖赏尽可能的少

【NOIP 2012 国王游戏】 贪心+高精度

题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每 位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右 手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序, 使得获得奖赏最多的大臣,所获奖赏尽可能的少

VMWare——window server 2008/2012 administrator 密码忘记,设置重置密码

用VMWare安装window server 2008或者2012忘记密码后,想要修改密码满麻烦的. 以下过程是我成功修改密码的过程: 1.首先需要需要链接一个ISO文件 需要特别注意把“启用连接”勾上,这个地方坑了我好长时间.不勾上,系统启动没办法CD-ROM Drive进入的. 2.关闭虚拟机.以下面的方式打开虚拟机: 3进入BIOS界面—>选择Boot:确保启动方式是以CD-ROM Driver 4.然后重新启动.重新启动后,会进入到安装系统界面. 5.点击下一步,在下一个界面左下面,第一

扩展欧几里得模板(洛谷1082 同余方程NOIP 2012 提高组 第二天 第一题)

题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正整数 x0,即最小正整数解.输入数据保证一定有解. 输入输出样例 输入样例#1: 3 10 输出样例#1: 7 说明 [数据范围] 对于 40%的数据,2 ≤b≤ 1,000: 对于 60%的数据,2 ≤b≤ 50,000,000: 对于 100%的数据,2 ≤a, b≤ 2,000,000,000

NOIP 2012

Prob.1 vigenere密码 模拟代码: #include<cstdio> #include<cstring> #include<iostream> using namespace std; char K[105],A[1005]; int main(){ scanf("%s",K);int p=0; scanf("%s",A); for(int i=0;A[i];i++){ char k=K[p]; if(isupper(

把数字串变成2012玛雅密码

问题: 玛雅密码是一串由0.1.2组成的密码,这串数字中如果包含2012,就可以解开末日的大门.给定一串由0.1.2组成的字符串,只有相邻的数字可以交换,求通过最少多少次变换可以得到玛雅密码,并给出这串密码. 思路: 经过很久很久的尝试,放弃了一次性拼凑2012的想法,改用预处理得到所有数字范围中符合玛雅密码的部分,再递归遍历给定的数字串,得到该串所有可能的变换,并比较每个变换的结果需要的步数. import sys def find_all_transfers(str): result={}

NOIP 2012 Day1

tags: NOIP 模拟 倍增 高精 Python categories: 信息学竞赛 总结 Luogu P1079 Vigenère 密码 Solution 表示并不是很懂其他人发的题解. 我是这么想的, 既然是题目要求用密文转明文而且转换规则一定的, 所以就可以用明文转密文的逆过程来完成. 首先要搞明白明文是怎么变成密文的, 通过这个表可以观察到, 如果明文的一个字符是 ch1 ,密钥为 ch2 , 那么密文 ch3 对应的就是 ch1 在字母表中偏移 |ch2| 位, 例如 \(\tex