P1079 Vigenère 密码

题目描述

16 世纪法国外交家 Blaise de VigenèreBlaisedeVigene`re 设计了一种多表密码加密算法―― VigenèreVigene`re 密码。 VigenèreVigene`re 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。在密码学中,我们称需要加密的信息为明文,用 M 表示;称加密后的信息为密文,用 C 表示;而密钥是一种参数,是将明文转换为密文或将

密文转换为明文的算法中输入的数据,记为 k 。 在 VigenèreVigene`re 密码中,密钥 k 是一个字母串, k=k1​,k2​,…,kn​ 。当明文 M=m1​,m2​,…,mn​ 时,得到的密文 C=C=c1​,c2​,…,cn​ ,其中 ci​ = mi​ ® ki​ ,运算®的规则如下表所示:

VigenèreVigene`re 加密在操作时需要注意:

  1. ®运算忽略参与运算的字母的大小写,并保持字母在明文 MM 中的大小写形式;

  2. 当明文 M 的长度大于密钥 k 的长度时,将密钥 k例如,明文 M=Helloworld ,密钥 k=abc 时,密文 C=Hfnlpyosnd 。

输入输出格式

输入格式:

共 2 行。

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

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

输出格式:

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

输入输出样例

输入样例#1:

CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm
输出样例#1:

Wherethereisawillthereisaway 

说明

【数据说明】

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

NOIP 2012 提高组 第一天 第一题

解题分析:

题目中说不区分大小写,所以输入后我们可以将两字符串转为相同的大小写,这里全部转为小写。

注意:大小写转换函数 大写strupr()  小写strlwr() 不可用,需要手写。

然而输出时需要以密文的大小写判断输出的大小写,所以另开一个数组储存密文,以便于输出判断大小写。

然后,考虑题目图中的密码规律,以Z-Z为分界线,你会发现左上角每一个字符用不相同的两组 字符 表示,两组字符ASCII码相加相等,同样右下角也这样。

根据这个规律,我们可以预处理出每两个字符组表示的字符(下边贴有代码)。

然后有了密文,有了密钥,我们又已经处理出来来了表示的字符,相反的推理回去,得出明文(注意大小写判断)

预处理部分:

最小相加为 a+a=194,最大z+z=244.

第一行处理左上角,第二行处理右下角。

    for(int i=;i<=;i++)ans[i]=char(i-'a');
for(int i=;i<=;i++)ans[i]=ans[i-];

AC代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
#define N int(100+2)
#define M int(1000+2)
char a[M],b[M],c[M],ans[];
int main()
{
scanf("%s",a+);int la=strlen(a+);
scanf("%s",b+);int lb=strlen(b+);
for(int i=;i<=lb;i++)c[i]=b[i];
for(int i=;i<=la;i++)if(a[i]<='Z'&&a[i]>='A')a[i]+=;
for(int i=;i<=lb;i++)if(b[i]<='Z'&&b[i]>='A')b[i]+=;
if(la<lb)
{
for(int i=la+;i<=lb;i++)a[i]=a[i-la]; //要密钥和密文一样长度,注意数组大小。
}
for(int i=;i<=;i++)ans[i]=char(i-'a'); //预处理部分。
for(int i=;i<=;i++)ans[i]=ans[i-];
for(int i=;i<=lb;i++)
{
for(int j=;j<=;j++)
{
if(b[i]==ans[j]&&j-a[i]<='z'&&j-a[i]>='a')
{
if(c[i]<='Z'&&c[i]>='A')printf("%c",j-a[i]-);
else printf("%c",j-a[i]);
}
}
}
}

2012 noip提高 Vigenère 密码的更多相关文章

  1. 2012 Noip提高组 Day1

    1262. [NOIP2012] Vigenère 密码 ★   输入文件:vigenere.in   输出文件:vigenere.out   简单对比时间限制:1 s   内存限制:128 MB [ ...

  2. 2012 Noip提高组 Day2

    1265. [NOIP2012] 同余方程 ★☆   输入文件:mod.in   输出文件:mod.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 求关于 x 的同余方 ...

  3. NOIP提高真题整理(2011-2018)-标签

    加粗的后面应该会有相应的简单解析(如果没咕的话:)). 2011 day1 T1:铺地毯:逆着铺 T2:选择客栈:按颜色分类枚举+二分答案 T3:Mayan游戏:大模拟dfs+剪枝 day2 T1:计 ...

  4. Vigenère密码 2012年NOIP全国联赛提高组(字符串模拟)

    P1079 Vigenère 密码 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简 ...

  5. Vigenère 密码NOIP 2012 提高组 第一天 第一题

    题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南 ...

  6. NOIp 2012 #1 Vigenère 密码 Label:模拟

    题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南 ...

  7. NOIP 2012 Vigenère 密码

    洛谷 P1079 Vigenère 密码 https://www.luogu.org/problemnew/show/P1079 JDOJ 1779: [NOIP2012]Vigenèr密码 D1 T ...

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

    题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南 ...

  9. Noip2012 提高组 Day1 T1 Vigenère 密码

    题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南 ...

随机推荐

  1. bzoj 4871: [Shoi2017]摧毁“树状图”【树形dp】

    做不来--参考https://www.cnblogs.com/ezyzy/p/6784872.html #include<iostream> #include<cstdio> ...

  2. CF788B Weird journey

    总共有n个节点,m条路径,要求其中m-2条路径走两遍,剩下2条路径仅走一遍,问不同的路径总数有多少,如果仅走一遍的两条边不同则将这两条路径视为不同. 可以把每条边都拆成两条重边,每条边的度数都是偶数了 ...

  3. iOS音频与视频的开发(二)- 使用AVAudioRecorder进行录制音频

    1.使用AVAudioRecorder录制视频 AVAudioRecorder与AVAudioPlayer类似,它们都属于AVFoundation的类.AVAudioRecorder的功能类似于一个录 ...

  4. safari 日期显示NAN

    解决方案: 1.服务器端将时间转换为时间戳,前端再进行处理,问题解决. fastjson,JSON.toJSONString() 自动将时间字段转换为时间戳类型,然后传到前端. @RequestMap ...

  5. CSS3鼠标放上去旋转代码

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Qt容器类之三:通用算法

    在<QtAlgorithm>头文件中,Qt提供了一些全局的模板函数,这些函数是可以使用在容器上的十分常用的算法.我们可以在任何提供了STL风格迭代器的容器类上用这些算法,包括QList.Q ...

  7. bzoj 4821 [Sdoi2017]相关分析

    题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4821 题解 做法显然 就是维护一颗线段树 里面装4个东西 区间x的和 区间y的和 区间$x^ ...

  8. 495 Teemo Attacking 提莫攻击

    在<英雄联盟>的世界中,有一个叫“提莫”的英雄,他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态.现在,给出提莫对艾希的攻击时间序列和提莫攻击的中毒持续时间,你需要输出艾希的中毒 ...

  9. Jenkins视图使用--添加删除视图

    job建立的特别多的时候,我们可能不太容易找到自己的某个job,这时,我们就可以在Jenkins中建立视图.job的视图类似于我们电脑上的文件夹.可以通过一些过滤规则,将已经建好的job过滤到视图中, ...

  10. AJPFX总结private关键字

    private关键字        什么是private关键字?                它是一个修饰符,代表私有的意思,它可以修饰成员变量和成员方法 private关键字的特点?        ...