NOIP201205Vigenère密码

  • 题目
    • 链接
    • 字面描述
      • 题目描述
      • 输入格式
      • 输出格式
      • 样例 #1
        • 样例输入 #1
        • 样例输出 #1
      • 提示
  • 思路
  • 代码实现

题目

链接

https://www.luogu.com.cn/problem/P1079

字面描述

题目描述

16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法 Vigenère 密码。Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。

在密码学中,我们称需要加密的信息为明文,用 M M M 表示;称加密后的信息为密文,用 C C C 表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为 k k k。 在 Vigenère 密码中,密钥 k k k 是一个字母串, k = k 1 , k 2 , … , k n k=k_1,k_2,…,k_n k=k1​,k2​,…,kn​。当明文 M = m 1 , m 2 , … , m n M=m_1,m_2,…,m_n M=m1​,m2​,…,mn​ 时,得到的密文 C = c 1 , c 2 , … , c n C=c_1,c_2,…,c_n C=c1​,c2​,…,cn​,其中 c i c_i ci​= m i m_i mi​® k i k_i ki​,运算®的规则如下表所示:

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

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

  2. 当明文 M M M 的长度大于密钥 k k k 的长度时,将密钥 k k k 重复使用。

例如,明文 M = Helloworld M=\texttt{Helloworld} M=Helloworld,密钥 k = abc k=\texttt{abc} k=abc 时,密文 C = Hfnlpyosnd C=\texttt{Hfnlpyosnd} C=Hfnlpyosnd。

输入格式

共 2 行。

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

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

输出格式

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

样例 #1

样例输入 #1

CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm

样例输出 #1

Wherethereisawillthereisaway

提示

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

NOIP 2012 提高组 第一天 第一题

思路

不妨看出加密格式是两个字母ASCII码值相加再取模26-1
反推一下:

if(x<0)x+=26;
x++;

建模完成开始写代码

代码实现

#include<bits/stdc++.h>
using namespace std;int k=-1;
string a,b;
int main(){//freopen("B.in","r",stdin);//freopen("B.out","w",stdout);cin>>b>>a;int lena=a.length(),lenb=b.length();//循环遍历字符串for(int i=0;i<lena;i++){//k密钥对应++k;if(k==lenb)k-=lenb;//解密输出char c=tolower(a[i]),d=tolower(b[k]);int x=(c-'a')-(d-'a');if(x<0)x+=26;x++;if(a[i]>='a'&&a[i]<='z')printf("%c",x+'a'-1);else printf("%c",x+'A'-1);}return 0;
}

NOIP201205Vigenère密码相关推荐

  1. 在Chrome中打开网页时出现以下问题 您的连接不是私密连接 攻击者可能会试图从 x.x.x.x 窃取您的信息(例如:密码、通讯内容或信用卡信息)

    现象:在Chrome中打开网页时出现以下问题 您的连接不是私密连接 攻击者可能会试图从 x.x.x.x 窃取您的信息(例如:密码.通讯内容或信用卡信息). 当点开"了解详情"后显示 ...

  2. 设置linux初始root密码

    简单一步设置linux第一个root密码 sudo passwd root #输入当前账户密码 #输入准备设置的root密码 #确认密码 如下所示:

  3. linux修改mysql密码sa_如何修改SA口令,数据库SA密码怎么改?

    [问题现象]安装数据库的时候设置过SA口令,安装后不记得了?有没有办法可以修改数据库SA口令? [原因分析]各版本数据库更改SA口令的方法不一样,一般MSDE2000数据库安装时没有SA口令,SQL ...

  4. python实现简单的用户密码登录控制(输入三次就锁定用户)

    问题描述 我们经常在登录一些网站的时候,发现我们如果连续的输错好几次密码,我们的帐号就被锁定起来了,那这个过程是如何实现的呢?本程序主要就是解决以下3件事情 1.输入用户名密码 2.认证成功并显示欢迎 ...

  5. mysql/mariadb centos7 修改root用户密码及配置参数

    一.修改用户密码,以root为例 1. 知道root密码,需要修改 方法a. 登入数据库来修改 # mysql -uroot -p /*输入密码进入*/ /*第一个方式:直接编辑数据库字段*/ Mar ...

  6. centos7系统中忘记了root管理员账号密码的解决方式

    随着计算机的使用越来越普遍,现在的用户都会有多个密码,不是这软件的密码就是那个的,QQ.邮箱.游戏,还有系统的登录密码!每一个密码都不一样!所以越来越多的密码需要去记住!也因为这样,只要其中一个长时间 ...

  7. LeetCode简单题之唯一摩尔斯密码词

    题目 国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如: 'a' 对应 ".-" , 'b' 对应 "--" , ' ...

  8. Redis使用认证密码登录

    Redis默认配置是不需要密码认证的,也就是说只要连接的Redis服务器的host和port正确,就可以连接使用. 这在安全性上会有一定的问题,所以需要启用Redis的密码认证功能,增加Redis服务 ...

  9. 启动MySQL:net start mysql出现问题+本地Mysql忘记密码的修改方法

    解决方法1:(普遍) 管理员开启cmd,进入bin文件夹,方法见图: cmd内输入:cd C:\Program Files\MySQL\MySQL Server 8.0\bin这里的路径要换成你自己b ...

最新文章

  1. 写代码:使用while循环实现输出1,2,3,4,5,7,8,9,11,12
  2. Oracle 常用命令 及近期使用问题集合
  3. 符合标准的TreeView实现(Div+CSS+JS+ASP.NET)
  4. mybatis查询时间段sql语句
  5. Python Demo 03 星期输出
  6. 银行核心系统之应用集成
  7. 344.Reverse String
  8. 拓扑排序---AOV图
  9. 使用截图工具FastStone Capture
  10. JQuery AJAX 的表单提交
  11. linux 代码编辑器软件下载,Visual Studio Code下载
  12. wnmp环境 php7,WNMP 开发环境搭建
  13. 重磅!SK海力士600亿收购Intel存储业务!
  14. python制作神经网络_MicroPython动手做(10)——零基础学MaixPy之神经网络KPU
  15. 反三角函数之间的关系以及导数关系
  16. 一样的产品,客户为什么不去亚马逊买而选择独立站
  17. 【电机学复习笔记】第五章 异步电动机
  18. java 统计字符串中每个字母有多少个
  19. 从“天地一体”到“移动组网”,中国量子通信产业是如何“炼成”的?
  20. 康柏v3322安装linux系统,SUN的服务器能安装Linux操作系统吗

热门文章

  1. Hive常用函数 - abs
  2. Bhuman应用篇——守门员防守之SpecialAction
  3. 作为程序员,首先要自清自己是什么人
  4. 微软共同创办人保罗艾伦逝世,终年65岁
  5. raid配置ssd为缓存_搞定INTEL快速存储技术(用SSD硬盘做缓存加速),再次更新!...
  6. svn和git不过是工具而已
  7. [转]IE6下的CSS BUG枚举
  8. WIN10系统C盘瘦身
  9. /MD与/MT、/MTD与/MDD的区别
  10. 打造卓越游戏 | 2023 Google 游戏开发者峰会