#P16601. [GCPC2021]Decrypting Zodiac
[GCPC2021]Decrypting Zodiac
题目描述
20 世纪 60 年代末,一名连环杀手犯下了骇人听闻的罪行。他既没有被抓获,身份也始终没有查明。由于他向新闻媒体寄出了一系列密码信件,人们称他为 Zodiac(黄道十二宫杀手)。当时人们推测,这些信件中包含了他的真实姓名;然而直到今天,其中一些信件仍未被完全破译。原因之一是,加密后的信息中含有错误。人们并不知道 Zodiac 是否故意制造了这些错误,以增加破译难度。

对于其中一封早期信件,他使用了如下两步加密方案:
- 首先使用凯撒密码。也就是说,他选择一个固定整数 ,其中 ,并将每个字母替换为字母表中向后移动 位的字母。字母表首尾循环,即
z的下一个字母是a。 - 然后,他在任意位置将信息切成两部分,并交换这两部分。允许其中一部分为空;此时第二步不会改变信息。
通常,可以通过简单的暴力枚举尝试解密。但是,这要求程序能够自动判断一段信息是否有意义。由于 Zodiac 可能在第一步加密时犯了一些错误,因此这件事并不容易。
于是你决定换一种方法:枚举一些有意义的候选明文,将它们按上述方式加密,然后计算至少需要多少个错误,才能与 Zodiac 给出的密文相符。
输入格式
输入包含:
- 第一行一个整数 (),表示两段信息的长度。
- 接下来两行各包含一个长度为 的字符串:
- 第一行为 Zodiac 给出的密文;
- 第二行为你猜测的明文。
两个字符串均只包含小写英文字母 a~z。
输出格式
输出一个整数,表示在你的明文猜测正确的前提下,Zodiac 在加密过程中至少犯了多少个错误。
换言之,你可以任意选择凯撒位移量和切分位置;答案是变换后的候选明文与给定密文之间最少的不同字符数。
样例 1
输入
6
drhmex
zodiac
输出
2
样例 2
输入
8
dicepara
paradise
输出
1
样例 3
输入
13
lvlvdvdqsonwk
thisisasample
输出
2
样例说明
在样例 1 中,将明文中的每个字母向后移动 位,可得到 dshmeg。此时除第 个和第 个字符外,其余字符都与密文相同,因此需要 个错误。
在样例 2 中,可以选择凯撒位移量为 ,然后从正中间切开字符串并交换两部分。完成操作后只有一处不匹配,即 s 与 c。
在样例 3 中,第一步选择向后移动 位,得到 wklvlvdvdpsoh。随后切下前两个字符,并将其移动到字符串末尾,得到 lvlvdvdpsohwk。此时只有两处不同:p 与 q,以及 n 与 h。