洛谷P1079 Vigenère 密码题解

P1079 [NOIP 2012 提高组] Vigenère 密码 而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为 k。,mn​ 时,得到的密文 C=c1​,c2​,…Vigenère 密码解密的核心在于利用加密运算表的逆运算,同时要注意忽略密钥和密文字母的大小写,且保持明文的大小写形式,当密钥长度小于密文长度时需重复使用密钥。对于 100% 的数据,输入的密钥的长度不超过 100,输入的密文的长度不超过 1000,且都仅包含英文字母。明文密钥密文​HaH​ebf​lcn​lal​obp​wcy​oao​rbs​lcn​dad​​。 阅读详情

这道题已经不接受题解了,但我还是要发一篇 ¯\(ツ)/¯

原题链接:P1079https://www.luogu.com.cn/problem/P1079

提交记录:提交·

Ascii码是关键点,有一点要记住:ord(string)将字符转为Ascii码,chr(inter)将Ascii码转为字符。

Ascii码对照表:C语言中文网http://c.biancheng.net/c/ascii/

一大难点就是如何计算R,下面是R的计算表:

 直接把表输入到程序里有些不科学,所以我们来找找规律。

可以看出,对于最左侧的一列字母,每一个字母对应的一行就是把这个字母之前的部分移到这一行的尾端。

f听不懂没关系,我们来看图:

如果第一个参数是D就可以看到D这一行中 D之前的ABC都被移到了尾端,对于别的也是一样,这样我们就可以通过R的一个参数来获取那一行的信息了。下面我们通过第二参数来获取确切的结果。我们先获取第二个参数在字母表中的编号,方法是将他的Ascii值减去64(仅用于大写字母),如果第二个参数是C那这个数字就是3 然后这一列中的3号的元素就是结果啦,如图所示:

 这就是R的计算方法啦!可这是根据两个参数得出结果的方法,即加密的方法,但我们需要的是解密的方法,即R的逆运算。方法就是在得出的列表中找到结果对应的数字,然后转化成Ascii码,就可以得到另一个参数了。上代码(语言:Python):

def r(letter_k,letter_c): #通过密文和密钥进行解密的函数
    #分别是已知的参数(密钥k的字符)和结果(密文C的字符)
    letter_k = letter_k.upper()#只能计算大写字母,所有要转换一下
    letter_c = letter_c.upper()
    letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',  #定义字母表
        'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 
        'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
    a_num = ord(letter_k)-64 #获取letter_k的Ascii码

    temp = letters[:a_num] #将letter_k之前的部分储存到temp中
    letters = letters[a_num:] #将这部分截掉
    letters = letters+temp #然后移到尾部

    for i in range(len(letters)): #历遍经过处理的字母表
        if letters[i] == letter_c: #如果找到了结果的位置:
            output = chr(i+66) #将其转化为Ascii码(为什么加66而不是64我也不是很清楚)
            if output == '[': #出于某些玄学问题,'A'会变成'[',不过加一个特判就好了
                output = 'A'
            return output #返回结果(明文M的字符,大写)

另一个要注意的是密钥的格式,如果密钥小于或等于密文,那就将密文的长度除以密钥的长度并向上取整(为什么向上取整请参考小学数学练习册)。如果密钥大于密文,就将多余的部分截掉。题目并没有说明这一点,但亲测正确。

完整代码:

import math #为了向上取整函数

def r(letter_k,letter_c): #通过密文和密钥进行解密的函数
    #分别是已知的参数(密钥k的字符)和结果(密文C的字符)
    letter_k = letter_k.upper()#只能计算大写字母,所有要转换一下
    letter_c = letter_c.upper()
    letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',  #定义字母表
        'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 
        'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
    a_num = ord(letter_k)-64 #获取letter_k的Ascii码

    temp = letters[:a_num] #将letter_k之前的部分储存到temp中
    letters = letters[a_num:] #将这部分截掉
    letters = letters+temp #然后移到尾部

    for i in range(len(letters)): #历遍经过处理的字母表
        if letters[i] == letter_c: #如果找到了结果的位置:
            output = chr(i+66) #将其转化为Ascii码(为什么加66而不是64我也不是很清楚)
            if output == '[': #出于某些玄学问题,'A'会变成'[',不过加一个特判就好了
                output = 'A'
            return output #返回结果(明文M的字符,大写)

k = input() #读取输入
c = input()
m = []

if len(k) <= len(c): #对密钥进行处理,详见正文
    n = math.ceil(len(c)/len(k))
    k = k*n
else:
    k = k[:len(c)]


for i in range(len(c)): #历遍密文
    letter = r(k[i],c[i]) #解密密文
    if ord(c[i]) >= 97 and ord(c[i]) <= 122: #小写字母的Ascii码是97~122
        #如果密文是小写,明文也转换为小写
        letter = letter.lower()
    m.append(letter)

print(''.join(m)) #join将作为参数的列表中的元素用字符串连接起来,详解正文

最后再讲一下join函数,join属于string类型,将作为参数的列表中的元素用字符串连接起来,比如:

'_'.join(['a','b','c'])

会返回一个字符串"a_b_c",如果是

"".join(a_list)

会将列表直接转换为字符串,非常实用。

洛谷 P1079 [NOIP2012 提高组] Vigenère 密码 16世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法Vigenère密码。Vigenère密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。在密码学中,我们称需要加密的信息为明文,用M表示;称加密后的信息为密文,用C表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为k。在Vigenère密码中,密钥k是一个字母串,k=k[1],k[2],…,k[n]。当明文M=m[1],m[2],…,m[n]时,得到的密文C 阅读详情

相关推荐

题解:洛谷 P1079 [NOIP 2012 提高组] Vigenère 密码

Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为。第二行为一个字符串,表示经加密后的密文,长度不超过。在密码学中,我们称需要加密的信息为明文,用。一个字符串,表示输入密钥和密文所对应的明文。

团爸讲算法 1177

洛谷刷题(普及-):分数线划定、潜伏者、Vigenère 密码、花生采摘、FBI树

突然就爱上了C++

林一百二十八的博客 832

Spark入门:从零到能跑的实战教程

Spark 的强大在于它统一了大数据处理的多种场景,从批处理到流处理,从 SQL 到机器学习。对于初学者来说,理解 Spark 的核心理念——内存计算和分布式抽象,是最重要的一步。接着,学会用 PySpark 搭建环境,能读数据、能写 SQL,基本上就入门了。剩下的路,就是通过实战去加深理解。写到这里,相信你对 Spark 已经有了一个比较完整的认识。下一步,不妨自己动手写几个 PySpark 脚本,跑一跑日志数据,或者尝试用 Spark SQL 做一个统计。

Morpheon的博客 1368

洛谷1079 Vigenère 密码

原题地址: https://www.luogu.org/problem/show?pid=1079 这是一道简单的模拟题……也许吧……反正我被卡了很久才把那些关系绕清楚。官方给的数据都过了,不知为啥洛谷上居然RE了两个点,有点莫名其妙。说实在的在NOIPD1T1这类的裸搜暴力模拟题中算写起来麻烦的,string、ascall、字符处理得用得很好才行。鉴于本文提供的参考代码在洛谷上诡异地RE了,

zero_from的博客 942

AHB不对称半桥反激电路设计(一)变换器拓扑工作原理详解

本文详细分析了AHB(不对称半桥)反激变换器拓扑的工作原理及关键优势。该拓扑通过谐振腔结构实现原边功率管的零电压开通(ZVS)和副边整流管的零电流关断(ZCS),显著提升效率至95%以上。文章阐述了6个工作阶段的时序特征,包括谐振电感电流和电容电压的数学模型推导。AHB拓扑具有漏感能量回收、宽电压输出(适配PD快充等场景)和协同储能等优势,相比传统方案可缩小变压器体积30%,成为100-300W隔离电源的理想选择。

【Simon】的博客 7126

【FPGA XDMA AXI Bridge 模式】PCIe:BARs 和 AXI:BARs 含义解析

Xilinx的 DMA/Bridge Subsystem for PCI Express IP核中,支持普通的XDMA模式,但是这种模式只允许主机端发起PCIe 读写请求,FPGA内部无法主动发起读写请求,也即FPGA无法主动读写HOST的内存。而该IP核的另一种模式,AXI Bridge模式则支持HOST主动读写,以及FPGA主动读写。该模式下有个参数需要配置,分别是PCIe:BARs以及AXI:BARs。而上述的普通模式只有PCIe:BARs需要配置。下面详细说说这两个参数的含义。

weixin_45888152的博客 3730

洛谷P1079Vigenère密码题解--zhengjun

题面传送门 思路 一道模拟,注意细节即可 代码 #include<bits/stdc++.h> using namespace std; string a,b; int main(){ cin>>a>>b; for(int i=0,j=0;i<b.length();i++,j=(j+1)%a.length()){ char x=a[j],y=b[i...

A_zjzj的博客 476

星链V3的2048条波束与1Tbps:多波束相控阵的工程代价

低轨卫星通信的容量提升,核心在于多波束相控阵天线的空间复用能力。相控阵通过控制大量天线单元的相位,可在同一阵面同时形成多条独立指向的波束,从而在有限频谱内成倍提升系统容量。星链V3宣称的2048条波束与1 Tbps汇聚吞吐量,正是基于这一原理:更多波束意味着更高的频率复用系数和更灵活的资源调度。但工程实现并非免费午餐,数字背后是供电、散热、重量、发射成本及运维复杂度的急剧攀升。从用户侧看,更精细的波束也带来切换频繁、低仰角衰减等新挑战。本文从多波束相控阵的基础原理出发,拆解波束形成、频谱复用和动态调度的工程

weixin_33462167的博客 346

7.3模拟比赛解题报告

067.3 NOIP模拟赛 说明:本次考试3道题3个小时。 1、洛谷P1003 铺地毯==codevs1134 铺地毯 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 n 张地毯,编号从 1 到n 。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。 地毯铺设完...

weixin_34000916的博客 208

【Codesys】获取从站信息,判断是否从站断联,总线丢失

获取EtherCAT从站信息,判断是否从站断联,总线丢失

qq_35316470的博客 5731

TRON 主网节点搭建-2024最新详细版文档

TRON主网节点搭建以前,大概说明一下本次使用的服务器配置,本次从搭建部署到节点完成同步的时间大约为36小时。

J_Lee 4057

NOIp2012 TG Day1-1 Vigenère 密码

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

banglu4273的博客 419

Serial RapidIO Gen2 IP 说明(三)

前言 继续接着上篇文章,介绍Serial RapidIO Gen2 IP 的具体端口信息。 一、端口描述 1、缓冲设计接口 2、物理层接口 参考说明 【1】Serial RapidIO Gen2 v4.1https://china.xilinx.com/content/dam/xilinx/support/documentation/ip_documentation/srio_gen2/v4_1/pg007_srio_gen2.pdf ...

记录所学,分享知识,结识挚友 1319

【题解】【洛谷P1079】【模拟】—— Vigenère密码

平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为。对于100%的数据,输入的密钥的长度不超过。的规则表,我们可以发现,将。

Pantheraonca的博客 1102

解读 2025《高质量数据集 质量评测规范》

《高质量数据集质量评测规范》为2025年数据质量评估提供标准化框架,适用于政府部门、AI企业、数据服务商等行业主体。规范以"说明文档-数据质量-模型应用"三维体系为核心:明确定义高质量数据集分类,细化各项指标要求(包括文档完整性、数据规范性、应用多样性等),并提供具体评分细则(百分制,90分达标)和计算方法。附录补充多模态数据处理细则,旨在建立可操作的质量评估标准,保障优质数据供给流通。

cdfunlove的博客 1878

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

洛谷-P1079-Vigenère密码

洛谷-P1079-Vigenere密码

爱编程的人 1334

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

洛谷 P1079 Vigenère 密码

P1079 Vigenère 密码 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码。Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为 南军所广泛使用。 在密码学中,我们称需要加密的信息为明文,用 M 表示;称加密后的信息为密文,用 ...

HJ921004的博客 223

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

dezhen7015的博客 244

信息学奥赛一本通 1402:Vigenère密码 | 1869:【12NOIP提高组】 | OpenJudge NOI 1.12 08 | 洛谷 P1079 [NOIP2012 提高组]

【题目链接】 ybt 1402:Vigenère密码 ybt 1869:【12NOIP提高组】Vigenère密码 OpenJudge NOI 1.12 08:Vigenère 密码 洛谷 P1079 [NOIP2012 提高组] Vigenère 密码 【题目考点】 1. ASCII码 2. 字符串 【解题思路】 观察®\circledR®运算,如果把密钥字符中A~Z用0~25代替,那么加密过程c=m®kc=m\circledR kc=m®k可以描述为:密文字符c为从明文字符m开始向后数密钥字符k对应的数

君义NOIP的博客 3289

洛谷----P1079 Vigenère 密码(知识点学习)

旧人旧事更值得怀念,或悲或喜每个人身上都承载着某一段时光,但是我会永远清澈永远疯狂永远浪漫。没有人能回到过去重新活过,但你我都可以从现在开始,决定我们未来的模样。 ---...

0k-ok 520

【寒假每日一题】洛谷 P1079 [NOIP2012 提高组] Vigenère 密码

在密码学中,我们称需要加密的信息为明文,用 M 表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为 k。对于 100% 的数据,输入的密钥的长度不超过 100,输入的密文的长度不超过 1000,且都仅包含英文字母。例如,明文 M=Helloworld,密钥 k=abc 时,密文 C=Hfnlpyosnd。第二行为一个字符串,表示经加密后的密文,长度不超过 1000,其中仅包含大小写字母。第一行为一个字符串,表示密钥 k,长度不超过 100,其中仅包含大小写字母。

m0_57587757的博客 913

NOIP 2012 Vigenère 密码

洛谷 P1079 Vigenère 密码 https://www.luogu.org/problemnew/show/P1079 JDOJ 1779: [NOIP2012]Vigenèr密码 D1 T1 https://neooj.com:8082/oldoj/problem.php?id=1779 题目描述 16 世纪法国外交家Blaise de...

anhaoti3785的博客 284

Vigenère 密码

首先要考虑的就是密钥k的长度问题,如果k的长度不够,我们需要把k不断的从第一个开始往后拼,直到拼到密文的长度,便于我们进行处理;最后就是可能密文减去密钥会出现明文字母已经出现了小于a(A)的情况了,再+26(字母26一循环)即可。然后需要考虑的是明文的大小写(题目的意思是密文如果是大写,输出的明文也必须是大写,特判即可/)主体思路还是a-z都代表了一个数字,a是0,z为25.(处理需要忽略大小写)稍微理解一下题目意思发现题目所给的表其实没有多大用处;用加密后的问题减去这些数字即为明文(也就是答案)

Lyh1gguyg的博客 514

【洛谷】P1079 Vigenère 密码

原题这是NOIP2012年提高组的Day1的第一题T1,自然不会有很难,那么究竟……有多水呢?题目描述16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密码。Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。在密码学中,我们称需要加密的信息为明文,用 M 表示;称加密后的信息为密文,用C 表示

PMYCQACF的博客 802
上一篇: 一些好笑的笑话
Edward 1014
博客等级 码龄5年 153粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值