U441261 Vigenère cipher(THOJ P1010)

题目背景

维吉尼亚密码(又译维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。 维吉尼亚密码曾多次被发明。该方法最早记录在吉奥万·巴蒂斯塔·贝拉索($Giovan\ Battista\ Bellaso$)于1553年所著的书《吉奥万·巴蒂斯塔·贝拉索先生的密码》(意大利语:$La\ cifra\ del.\ Sig.\ Giovan\ Battista\ Bellaso$)中。然而,后来在19世纪时被误传为是法国外交官布莱斯·德·维吉尼亚($Blaise\ De\ Vigenère$)所创造,因此现在被称为“维吉尼亚密码”。 维吉尼亚密码以其简单易用而著称,同时初学者通常难以破解,因而又被称为“不可破译的密码”(法语:$le\ chiffre\ indéchiffrable$)。这也让很多人使用维吉尼亚密码来加密的目的就是为了将其破解。

题目描述

维吉尼亚密码是由 $d$ 个字母序列给定的密钥 $k_i(i \in [1,d])$,$k_i$ 确定第 $i+t_d$($t$ 为整数)个字母的移位次数。 现代维吉尼亚密码代换表如下,第一行为密钥,第一列为明文,某明文对应密钥加密产生的密文即为该行该列处的字母。

输入格式

第一行一个整数 $t$,代表操作的次数。 接下来 $3n$ 行: 第 $i$ 行,一个全部由字母组成的字符串 $s$; 第 $i + 1$ 行一个全部由 **小写** 字母组成的字符串 $k$ 代表密钥; 第 $i + 2$ 行一个整数 $op$,$op$ 为 $0$ 代表加密,$op$ 为 $1$ 代表解密。

输出格式

共 $n$ 行,每行一个字符串,代表操作后的结果。

说明/提示

### 维吉尼亚密码表 ![Virginia cipher table](https://cdn.luogu.com.cn/upload/image_hosting/t0dg7b3d.png) ### 样例解释 1. 明文:$s = \texttt{WhichFruitULike}$ 密钥:$k = \texttt{apple}$ 第一个字母明文 $s_1 = \texttt{W}$,密钥 $k_1 = \texttt{a}$,对照维吉尼亚密码表加密后密文为 $\texttt{W}$。 $\dots$ 第六个字母明文 $s_6 = \texttt{F}$,密钥 $k_6$ 不存在,因此重置密钥 $k_1 = \texttt{a}$,对照维吉尼亚密码表加密后密文为 $\texttt{F}$。 $\dots$ 第十五个字母明文 $s_{15} = \texttt{e}$,密钥 $k_5 = \texttt{e}$,对照维吉尼亚密码表加密后密文为 $\texttt{i}$。 因此,最终加密的密文为 $\texttt{WwxnlFgjtxUAxvi}$。 2. 密文:$s = \texttt{WwxnlFgjtxUAxvi}$ 密钥:$k = \texttt{apple}$ 第一个字母密文 $s_1 = \texttt{W}$,密钥 $k_1 = \texttt{a}$,对照维吉尼亚密码表解密后明文为 $\texttt{W}$。 $\dots$ 第六个字母密文 $s_6 = \texttt{F}$,密钥 $k_6$ 不存在,因此重置密钥 $k_1 = \texttt{a}$,对照维吉尼亚密码表解密后明文为 $\texttt{F}$。 $\dots$ 第十五个字母密文 $s_{15} = \texttt{e}$,密钥 $k_5 = \texttt{e}$,对照维吉尼亚密码表解密后明文为 $\texttt{i}$。 因此,最终解密的明文为 $\texttt{WhichFruitULike}$。 ### 数据范围 $1 \le t \le 100$; $1 \le |s|, |k| \le 100$。 ### 题目来源 [$\text{THOJ\ P1010}$](https://oj.xzynb.top/d/Touhou/p/1010) ```cpp #include #include using namespace std; void encrypt(char *s, char *result, char *key); // 加密 void decrypt(char *s, char *result, char *key); // 解密 int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); // 关闭同步流 int t; cin >> t; while (t--) { char s[100] = ""; // 明文或密文 char key[100] = ""; // 密钥 char result[100] = ""; // 存储加密或解密后的结果 bool op; cin >> s >> key >> op; // 输入 if (!op) { // 加密 encrypt(s, result, key); cout