在本题单中,还有另一个问题(vigenere)要求你实现维吉尼亚密码(Vigenère Cipher)加密算法。这一次,我们将展示该密码的其中一个缺陷。
一个名为“业余破译者运动”(Amateur Codebreakers Movement, ACM)的秘密组织强烈怀疑银行劫匪正计划在近期发动另一次袭击。不幸的是,我们既不知道银行的名字,也不知道确切的日期 and 时间。ACM 能够窃听劫匪与其司机之间的通信,但该通信是使用维吉尼亚密码加密的。
你的任务是尝试破译该密码。你将获得两个很可能出现在原始明文中的单词——即所谓的“已知明文片段”(cribs,此类单词在破译著名的恩尼格玛密码等事件中发挥了重要作用)。
输入格式
(关于维吉尼亚密码的具体定义,请参考 vigenere 问题。)
输入包含多组测试数据。每组测试数据由四行组成:
- 第一行是一个整数 $K$($1 \le K \le 100$),表示需要考虑的加密密钥的最大长度。
- 第二行和第三行包含已知明文片段 $W_1$ 和 $W_2$($1 \le K \le \text{length}(W_i) \le 100$)。
- 第四行是密文 $C$($1 \le \text{length}(C) \le 100\,000$)。
已知明文片段 $W_1, W_2$ 和密文 $C$ 均仅由标准英文字母表中的大写字母 $\{A, B, C, \dots, Z\}$ 组成。 输入以包含一个零的行结束。
输出格式
你的程序必须确定存在多少种不同的明文,它们同时包含给定的两个已知明文片段,并且在使用某个长度为 $Q$($1 \le \text{length}(Q) \le K$)的密钥进行维吉尼亚加密后能够得到给定的密文。
对于每组输入数据,输出一行:
- 如果恰好存在一种满足所有条件的明文,输出该明文,且不包含多余的空格。
- 如果存在两种或更多种这样的明文,输出单词
ambiguous。 - 如果不存在这样的明文,输出单词
impossible。
样例
输入格式 1
4 BANK MONEY FTAGUAVMKILCKPRIJCHRJZIYUAXFNBSLNNXMVDVPXLERWDSL 5 SECOND PARSEC SUKCTZHYYES 3 ACM IBM JDNCOFBEN 4 ABCD EFGH OPQRHKLMN 0
输出格式 1
WEWILLROBTHEBANKANDTAKEALLTHEMONEYTOMORROWATNOON impossible ambiguous EFGHXABCD