#P16601. [GCPC2021]Decrypting Zodiac

[GCPC2021]Decrypting Zodiac

题目描述

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

对于其中一封早期信件,他使用了如下两步加密方案:

  1. 首先使用凯撒密码。也就是说,他选择一个固定整数 kk,其中 0k250\le k\le 25,并将每个字母替换为字母表中向后移动 kk 位的字母。字母表首尾循环,即 z 的下一个字母是 a
  2. 然后,他在任意位置将信息切成两部分,并交换这两部分。允许其中一部分为空;此时第二步不会改变信息。

通常,可以通过简单的暴力枚举尝试解密。但是,这要求程序能够自动判断一段信息是否有意义。由于 Zodiac 可能在第一步加密时犯了一些错误,因此这件事并不容易。

于是你决定换一种方法:枚举一些有意义的候选明文,将它们按上述方式加密,然后计算至少需要多少个错误,才能与 Zodiac 给出的密文相符。

输入格式

输入包含:

  • 第一行一个整数 nn1n1.5×1051\le n\le 1.5\times 10^5),表示两段信息的长度。
  • 接下来两行各包含一个长度为 nn 的字符串:
    • 第一行为 Zodiac 给出的密文;
    • 第二行为你猜测的明文。

两个字符串均只包含小写英文字母 az

输出格式

输出一个整数,表示在你的明文猜测正确的前提下,Zodiac 在加密过程中至少犯了多少个错误。

换言之,你可以任意选择凯撒位移量和切分位置;答案是变换后的候选明文与给定密文之间最少的不同字符数。

样例 1

输入

6
drhmex
zodiac

输出

2

样例 2

输入

8
dicepara
paradise

输出

1

样例 3

输入

13
lvlvdvdqsonwk
thisisasample

输出

2

样例说明

在样例 1 中,将明文中的每个字母向后移动 44 位,可得到 dshmeg。此时除第 22 个和第 66 个字符外,其余字符都与密文相同,因此需要 22 个错误。

在样例 2 中,可以选择凯撒位移量为 00,然后从正中间切开字符串并交换两部分。完成操作后只有一处不匹配,即 sc

在样例 3 中,第一步选择向后移动 33 位,得到 wklvlvdvdpsoh。随后切下前两个字符,并将其移动到字符串末尾,得到 lvlvdvdpsohwk。此时只有两处不同:pq,以及 nh