[字符串][NOIP2012]Vigenère密码

Posted GldHkkowo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[字符串][NOIP2012]Vigenère密码相关的知识,希望对你有一定的参考价值。

Vigenère密码

题目描述

 

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 加密在操作时需要注意:
    1. ?运算忽略参与运算的字母的大小写,并保持字母在明文M 中的大小写形式;
    2. 当明文M 的长度大于密钥k 的长度时,将密钥k 重复使用。
    例如,明文M=Helloworld,密钥k=abc 时,密文C=Hfnlpyosnd。

 

明文
H        
e     
l    
l     
o     
w    
o     
r     
l    
d
密钥
a        
b     
c    
a     
b     
c    
a     
b     
c    
a
密文
H        
f     
n    
l     
p     
y    
o     
s     
n    
d

 

 

 

输入

 

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

 

输出

 

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

  

 

样例输入

 

CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm

 

样例输出

 

Wherethereisawillthereisaway

 

提示

 

 

对于 100%的数据,输入的密钥的长度不超过100,输入的密文的长度不超过1000,且

都仅包含英文字母。

 

 

代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std; 
 5 const int Maxv = 1010;
 6 
 7 int main(){
 8     
 9     char wd1[Maxv], wd2[Maxv] ; 
10     scanf("%s%s", wd1 + 1, wd2 + 1); 
11     int len1 = strlen(wd1 + 1); 
12     int len2 = strlen(wd2 + 1); 
13     for (int i = 1, j = 1; i <= len2; i++, j++) {
14         int ans = 0; 
15         if (j > len1) {
16             j = 1; 
17         }
18         if (wd1[j] >= A && wd1[j] <= Z) {
19             wd1[j] = wd1[j] - A + a; 
20         }
21         if (wd2[i] >= A && wd2[i] <= Z) {
22             ans = A - a; 
23             wd2[i] = wd2[i] - A + a; 
24         }
25         char c = wd2[i] - (wd1[j] - a);
26         if (!(a <= c && c <= z)) {
27             c += 26; 
28         }
29         putchar(c + ans); 
30     }
31     return 0; 
32 }

 











以上是关于[字符串][NOIP2012]Vigenère密码的主要内容,如果未能解决你的问题,请参考以下文章

[NOIP2012] 提高组 洛谷P1079 Vigenère 密码

Noip2012 提高组 Day1 T1 Vigenère 密码

1402Vigenère密码(Noip2012提高组第1题)

Vigenère密码

Vigenère密码

Vigenère密码