列表

详情


NC16560. [NOIP2012]Vigenère 密码

描述

16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法―― Vigenère 密码。 Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。
在密码学中,我们称需要加密的信息为明文,用 M 表示;称加密后的信息为密文,用 C 表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为 k 。 在 Vigenère 密码中,密钥 k 是一个字母串, k=k1,k2,…,kn 。当明文 M=m1,m2,…,mn 时,得到的密文 C=c1,c2,…,cn ,其中 ci = mi ® ki ,运算®的规则如下表所示:

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

输入描述

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

输出描述

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

示例1

输入:

CompleteVictory
Yvqgpxaimmklongnzfwpvxmniytm

输出:

Wherethereisawillthereisaway

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 504K, 提交时间: 2019-02-24 09:04:57

#include <iostream>
using namespace std;
int main() {
    string k,c;
    cin>>k>>c;
    for (int i=0;i<c.length();i++) {
        int t=(k[i%k.length()]&31)-1;
        c[i]=(c[i]&31)-t>0?c[i]-t:c[i]-t+26;
    }
    cout<<c<<endl;
    return 0;
}

Python3 解法, 执行用时: 48ms, 内存消耗: 4660K, 提交时间: 2022-04-06 01:55:02

k=input()
m=input()
k = k*(len(m)//len(k)+1)
k=k.upper()
for i in range(len(m)):
    kk=ord(k[i])-65
    s=m[i]
    mm=ord(s.upper())-65
    if mm>=kk:
        j=chr(ord(m[i])-kk)
    else:
        j=chr(ord(m[i])-kk+26)
    print(j,end='')

C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 472K, 提交时间: 2023-04-02 22:18:07

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string k,c;
	cin>>k>>c;
	int len=k.length();
	for(int i=0;i<c.length();i++)
	{
		int t=(k[i%len]&31)-1;
		c[i]=(c[i]&31)>t?c[i]-t:c[i]+26-t;//看题目
	}
	cout<<c;
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 3ms, 内存消耗: 492K, 提交时间: 2020-03-12 19:56:34

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string k,c;
	cin>>k>>c;
	for(int i=0;i<c.length();i++)
	{
		int t=(k[i%k.length()]&31)-1;
		c[i]=(c[i]&31)-t>0?c[i]-t:c[i]-t+26;
	}
	cout<<c;
	return 0;
}

上一题