#iai28t3. 凯撒解密(Caesar Decryption)

凯撒解密(Caesar Decryption)

凯撒解密(Caesar Decryption)

题目描述

凯撒加密,是一种简单且广为人知的加密技术。需要加密的信息称之为明文,加密后的信息称之为密文。凯撒加密是将明文中的字母都按照一个固定的数量进行偏移,偏移后的结果就是密文,我们也称这个偏移的数量为密钥,密钥值介于 1 至 25 之间。

例如:当密钥为 3 时,表示每个字母往后偏移 3 个位置,即:

a → d,b → e,c → f,……,x → a,y → b,z → c

  • 明文字母:a b c d e f g h i j k l m n o p q r s t u v w x y z

  • 密文字母:d e f g h i j k l m n o p q r s t u v w x y z a b c

小爱现在得到了一串密文 ss,密文由一句句子组成,句子中的单词与单词之间由空格隔开,密文句结尾由换行符结束。但是粗心的他忘记了密钥是多少,他只记得原文中一定含有单词 tt

请你根据小爱提供的信息,帮他计算出密钥可能的种数与所有可能的密钥值。

例如,小爱得到的密文为:wow my memory is php code yep,已知原文中出现了 iai 这个单词,则密钥有 2 种可能:

  • 当密钥为 7 时,原文单词 iai 向后偏移 7 个字母可以得到 php,在密文中有出现该单词
  • 当密钥为 14 时,原文单词 iai 向后偏移 14 个字母可以得到 wow,在密文中有出现该单词

然而,当密钥为 4 时,iai 向后偏移 4 个字母得到的 mem,尽管 mem 是单词 memory 的前缀,但 mem 并不是独立的一整个单词,因此 4 并不是可能的密钥。

输入格式

输入共两行:

输入第一行:一个字符串 TT,表示加密前的原文中包含单词 TT,字符串 TT 为一个单词,字母之间无空格。

输入第二行:一个字符串 SS,表示加密后的密文,单词与单词之间由空格隔开,行末以换行作为结束标志。

数据保证,输入的密文与原文单词,均仅由小写字母构成,不包含其他字符。

输出格式

输出第一行:一个正整数,表示可能的密钥种数。

输出第二行:若干个正整数,表示所有可能的密钥值,按字典序从小到大输出。

注意:若给定数据无法找到可行密钥,则在仅需第一行输出 Error,无需输出第二行。

数据范围

对于 100% 的数据,1S10001 \le |S| \le 10001T201 \le |T| \le 20

式中,S|S| 表示密文字符串长度,T|T| 表示单词字符串长度

样例输入 #1

iai
wow my memory is php code yep

样例输出 #1

2
7 14

样例输入 #2

yacs
hello world

样例输出 #2

Error

知识点与难度

本题涉及的知识点从属于 GESP 4级,难度等级:⭐⭐


测试点分布

Subtask 分值 测试点编号 说明
0 10 1~2 样例
1 20 3~8 小规模 / 特殊: 唯一密钥 / 特殊: 多密钥 / 特殊: 单词长度相同
2 15 9~11 Hack: 密钥25 / Hack: 前缀匹配陷阱 / Hack: 多词相同
3 30 12~20 中大规模 S≈500~1000 压力
4 25 21~25 随机回归