Go 语言被设计为具有简单的 API 并支持多线程。Code Jam 团队希望将这些目标推向极致,因此我们提出了一种名为 Go++ 的新语言。
Go++ 语言使用一个寄存器,该寄存器存储一个布尔值(0 或 1)。该寄存器初始化为 0。该语言有三条指令:
0,将寄存器设置为 0。
1,将寄存器设置为 1。
* ?,打印当前的寄存器值。
很简单,对吧?为了支持多线程,我们允许两个不同的 Go++ 程序同时运行,同时共享这一个寄存器。每条指令都是原子执行的——也就是说,一条指令必须完全执行完毕,下一条指令才能开始。然而,这两个程序可以以任何保留各自程序内相对顺序的方式交错执行。
例如,以下是两个程序 1? 和 ?0 同时执行的仅有的六种方式。(第二个程序下的下划线仅用于将其指令与第一个程序中的指令区分开来。)
?01?,将打印 01。(记住寄存器初始化为 0。)
?10?,将打印 00。
?1?0,将打印 01。
1?0?,将打印 10。
1??0,将打印 11。
1??0,将打印 11。
注意,输出字符串总是由 0 和 1 组成,从不包含 ?,因为 ? 不是寄存器可能处于的状态。
通常,程序员编写程序是为了产生期望的输出,但你的任务是编写两个程序,使得它们不会产生不期望的输出!具体来说,你将得到一个长度为 $L$ 的“坏”字符串 $B$,以及一组包含 $N$ 个长度为 $L$ 的“好”字符串的集合 $G$。你必须编写两个 Go++ 程序(不一定长度相同),当按照此处描述的方式运行时,它们可以产生 $G$ 中的所有字符串,但不能产生字符串 $B$。如果程序还能产生既不是 $B$ 也不是 $G$ 中的其他字符串,那是可以接受的。注意,两个程序中必须总共包含恰好 $L$ 个 ? 指令。两个程序中的指令总数不得超过 200。
例如,对于 $B = 11$ 和 $G = \{ 10, 00 \}$,程序 ? 和 10?1 将是一个有效的答案。它们可以产生 $G$ 中的每一个字符串,但无论它们如何交错,都无法产生 $B$。(它们也可以产生字符串 01,这既不是 $B$ 也不在 $G$ 中,但这没关系。)然而,程序 1? 和 ?0 将不是一个有效的答案,因为(正如我们上面看到的)它们可以产生 $B$。程序 00 和 ?? 也不是一个有效的答案,因为它们不能产生 $G$ 中的每一个字符串。
你能编写出满足条件的两个程序,或者确定该任务是 IMPOSSIBLE(不可能)吗?
输入格式
输入的第一行给出测试用例的数量 $T$。接下来是 $T$ 个测试用例;每个测试用例包含三行。每个测试用例的第一行有两个整数 $N$ 和 $L$:$G$ 中的字符串数量,以及 $B$ 字符串和 $G$ 中字符串的长度。第二行有 $N$ 个长度为 $L$ 的不同字符串:$G$ 中的字符串。第三行有一个长度为 $L$ 的字符串:坏字符串 $B$。$B$ 和 $G$ 中的所有字符串都仅由 0 和/或 1 组成。
输出格式
对于每个测试用例,如果没有任何程序满足条件,则输出一行 Case #x: IMPOSSIBLE;否则,输出 Case #x: y z,其中 $x$ 是测试用例编号(从 1 开始),$y$ 和 $z$ 是满足条件的两个程序。程序中的指令总数不得超过 200。每个程序必须至少包含一条指令。两个程序中必须总共包含恰好 $L$ 个 ? 指令。
数据范围
时间限制:每个测试集 20 秒。 内存限制:1 GB。 $1 \le T \le 100$。 $1 \le N \le 100$。 $1 \le L \le 50$。 $G$ 中的所有字符串均不相同。
小数据集(测试集 1 - 可见)
$B$ 完全由 1 组成。
大数据集(测试集 2 - 隐藏)
$B$ 可以是任何由 0 和/或 1 组成的字符串。
样例
输入 1
3 2 2 10 00 11 3 2 11 10 00 01 4 2 00 01 10 11 11
输出 1
Case #1: ? 10?1 Case #2: 1?? 0 Case #3: IMPOSSIBLE
说明
样例输出显示了针对样例测试用例的一组答案。可能存在其他答案。 样例 #1 是题目描述中提到的情况。 样例 #2 不会出现在小数据集中。 样例 #3 显然是 IMPOSSIBLE,因为 $B$ 在 $G$ 中。