码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷 P1079 Vigenère 密码 题解

时间:2017-09-13 23:28:32      阅读:407      评论:0      收藏:0      [点我收藏+]

标签:algorithm   let   world   循环   freopen   http   amp   str   std   

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。

题目链接:https://www.luogu.org/problem/show?pid=1079

题目描述

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。

技术分享

输入输出格式

输入格式:

输入共 2 行。

第一行为一个字符串,表示密钥 k,长度不超过 100,其中仅包含大小写字母。第二行

为一个字符串,表示经加密后的密文,长度不超过 1000,其中仅包含大小写字母。

输出格式:

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

输入输出样例

输入样例#1:
CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm 
输出样例#1:
Wherethereisawillthereisaway 

说明

【数据说明】

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

都仅包含英文字母。

NOIP 2012 提高组 第一天 第一题

 

分析:

讲道理,我并没有看懂那张图,幸好表格就把意思描述得很明确了。

以明文的大写字母B为例,如果它对应的密钥是‘b‘,那它的密文就应该是‘B‘+‘(‘b‘-‘a‘) = ‘C‘。

那么如果大写字母B是密文,它的明文就应该是‘B‘-(‘b‘-‘a‘) = ‘A‘。小写字母同理。

注意两点:1.密钥循环使用  2.字母经过加密/解密处理后可能会小于正常值,这时需要+26

 

AC代码:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5 
 6 char KEY[1005],end[10005],ans[10005];
 7 //KEY是读入的密钥,end是密文,ans是明文
 8 int key[1005],tmp;
 9 //key是经过处理后可以直接使用的密钥的值
10 
11 int main()
12 {
13 //    freopen("1.txt","r",stdin);
14     scanf("%s",KEY+1);
15     scanf("%s",end+1);
16     int n = strlen(KEY+1);
17     for(int i = 1;i <= n;++ i)
18         if(KEY[i] >= a)
19             key[i] = KEY[i]-a;
20         else
21             key[i] = KEY[i]-A;
22     int len = strlen(end+1);
23     for(int i = 1;i <= len;++ i)
24     {
25         if(i%n == 0) tmp = n;
26         else tmp = i%n;
27         ans[i] = end[i] - key[tmp];
28         if(ans[i] < A || (end[i] > Z && ans[i] < a)) ans[i] += 26;
29     }
30     for(int i = 1;i <= len;++ i)
31         printf("%c",ans[i]);
32     puts("");
33     return 0;
34 } 

 

洛谷 P1079 Vigenère 密码 题解

标签:algorithm   let   world   循环   freopen   http   amp   str   std   

原文地址:http://www.cnblogs.com/shingen/p/7517937.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!