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$ 行,每行一个字符串,代表操作后的结果。
说明/提示
### 维吉尼亚密码表

### 样例解释
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