#P17359. [ECNA 2024] Leapfrog Encryption

[ECNA 2024] Leapfrog Encryption

题目描述

我们设计了一种新的加密方法,称为“跳蛙加密”。这是一种基于密钥的加密方案,字母密钥规定明文中的字母如何放入密文。具体步骤如下:

  1. 删除明文中的所有非字母字符,并把剩余字母全部转换为小写。

  2. 把密钥中的每个字母转换成“它在字母表中的位置加 11”。因此 a 转换为 22,b 转换为 33,依此类推。由此得到数列 d1,d2,…,dnd_1,d_2,\ldots,d_n,其中 nn 是密钥长度。

  3. 从左向右扫描密文位置,把明文开头的字母依次放入每第 d1d_1 个位置,直到密文中不再有这样的可用位置。密文长度等于明文字母数。例如,若 d1=5d_1=5,明文第一个字母放在密文第 55 位,第二个放在第 1010 位,依此类推;密文位置从 11 开始编号。

  4. 使用 d2d_2 重复这一过程,但改为从右向左扫描密文,并且只计数空位置,跳过已经填入字母的位置。

  5. 继续依次使用 d3,d4,…d_3,d_4,\ldots,每一趟都交替改变扫描方向。

  6. 使用完 dnd_n 后,如果明文仍有剩余字母,就按与上一趟相反的方向把它们依次填入所有空位置。这等价于再使用 dn+1=1d_{n+1}=1。

例如,明文为 Send more monkeys!、密钥为 bea 时,加密过程如下:

当前步骤 密文位置
b →3\to 3,从左向右 _ _ s _ _ e _ _ n _ _ d _ _ m
e →6\to 6,从右向左 _ _ s _ _ e o _ n _ _ d _ _ m
a →2\to 2,从左向右 _ r s _ e e o _ n m _ d o _ m
最后一趟,从右向左 s r s y e e o e n m k d o n m

至于解密该怎么做……嘿,你知道吗?这个就留给你自己推导吧。

输入格式

第一行包含两个字符串 t,kt,k。tt 为 E 或 D,分别表示执行加密或解密;kk 是只含小写字母的密钥,长度在 11 到 100100 之间。

第二行也是最后一行,包含要加密的明文(若 tt 为 E)或要解密的密文(若 tt 为 D)。该字符串非空,长度不超过 20002000。密文只含小写字母;明文还可以含大写字母、数字、标点和空格,这些字符都计入字符串长度,并保证明文至少含一个字母。

输出格式

输出加密或解密后的文本。输出只能包含小写字母。

E bea
Send more monkeys!
srsyeeoenmkdonm
D bea
srsyeeoenmkdonm
sendmoremonkeys
D zyxwvutsrqponmlkjihgfedcba
lafogrpe
leapfrog