Kitoshima 编程竞赛的委员会成员决定使用加密软件进行秘密通信。他们要求一家名为 Kodai Software 的公司开发一款基于高度复杂数学的加密软件。
根据关于 IT 项目的报告,许多项目都无法按时、按预算并具备所需的功能和特性交付。本案也是如此。Kodai Software 未能在约定的交付日期前实现该密码,并请求暂时使用一种采用替换密码的简化版本。委员会成员非常生气,并强烈要求交付完整规格的产品,但他们还是不情愿地决定暂时使用这款劣质产品。
在下文中,我们将加密前的文本称为明文(plaintext),加密后的文本称为密文(ciphertext)。
这种简单的密码会替换明文中的字母,其替换规则由一组字母对(pair)指定。一个字母对由两个字母组成,且是无序的,也就是说,字母对中字母的顺序无关紧要。字母对 (A, B) 和字母对 (B, A) 具有相同的含义。在一种替换规则中,一个字母最多只能出现在一个字母对中。当字母对中的某个字母出现在明文中时,该字母会被替换为该字母对中的另一个字母。未在任何字母对中指定的字母保持不变。
例如,使用替换规则 $\{(A, Z), (B, Y)\}$ 替换明文:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
会得到以下密文:
ZYCDEFGHIJKLMNOPQRSTUVWXBA
这可能对我们来说是一个巨大的机会,因为这种替换规则在破解面前显得非常脆弱。我们也许能够得知委员会成员之间的通信内容。这里的任务是开发一个解密程序,从给定的密文消息中找出明文消息。
密文消息由一个或多个密文单词组成。密文单词是通过某种替换规则从明文单词生成的。你拥有一个候选单词列表,其中包含了可能在明文中出现的单词;不会出现其他单词。列表中的某些单词实际上可能并没有在明文中被使用。
总是存在至少一种候选单词的序列,使得给定的密文可以通过某种替换规则从中获得。在某些情况下,可能无法从给定的密文和候选单词列表中唯一确定明文。
输入格式
输入由多个数据集组成,每个数据集包含一个密文消息和一个候选单词列表,格式如下:
$$n$$ $$word_1$$ $$\vdots$$ $$word_n$$ $$sequence$$
第一行中的 $n$ 是一个正整数,表示候选单词的数量。接下来的 $n$ 行中,每行表示一个候选单词。最后一行 $sequence$ 是由一个或多个密文单词组成的序列,单词之间用单个空格分隔,并以句点(.)结尾。
你可以认为每个 $sequence$ 中的字符数(包括空格和句点)大于 1 且小于或等于 80。列表中的候选单词数量 $n$ 不超过 20。单词中仅使用 26 个大写字母 A 到 Z,每个单词的长度在 1 到 20 之间(含边界)。
仅包含一个零的行表示输入结束。
输出格式
对于每个数据集,你的程序应该在单行中输出解密后的消息。输出行中相邻的两个单词应使用单个空格分隔,最后一个单词后应紧跟一个句点。当无法唯一确定明文时,输出行应为一个单连字符(-)后跟一个句点。
样例
输入样例 1
4 A AND CAT DOG Z XUW ZVX Z YZT. 2 AZ AY ZA. 2 AA BB CC. 16 A B C D E F G H I J K L M N O ABCDEFGHIJKLMNO A B C D E F G H I J K L M N O ABCDEFGHIJKLMNO. 0
输出样例 1
A DOG AND A CAT. AZ. -. A B C D E F G H I J K L M N O ABCDEFGHIJKLMNO.