#P13205. [GCJ 2016 #3] Go++
[GCJ 2016 #3] Go++
Description
Go 语言的设计目标是提供简单的 API 并支持多线程。Code Jam 团队希望将这些目标发挥到极致,因此我们提出了一种新语言,名为 Go++。
Go++ 语言只使用一个寄存器,该寄存器存储一个布尔值(0 或 1)。寄存器初始值为 0。该语言有三种指令:
- ,将寄存器设置为 0。
- ,将寄存器设置为 1。
- ,输出当前寄存器的值。
很简单,对吧?为了支持多线程,我们允许两段不同的 Go++ 程序同时运行,并共享同一个寄存器。每条指令都是原子的——也就是说,每条指令必须完全执行完毕后,下一条指令才能开始执行。不过,两段程序的指令可以以任意方式交错执行,只要每段程序内部指令的相对顺序不变。
例如,下面是将两段程序 和 同时执行时所有可能的六种交错方式(下划线仅用于区分第二段程序的指令):
- ,输出为 。(记住寄存器初始为 0。)
- ,输出为 。
- ,输出为 。
- ,输出为 。
- ,输出为 。
- ,输出为 。
注意,输出字符串始终只包含 和 ,而不会有 ,因为 不是寄存器的状态。
通常,程序员会写程序以产生期望的输出,而你的任务则是编写两段程序,保证不会产生某个“不良输出”!具体来说,你会得到一个长度为 的“不良字符串” ,以及一个包含 个长度为 的“良好字符串”集合 。你需要构造两段 Go++ 程序(长度可以不同),使得两段程序以上述规则交错执行时,能够产生 中所有字符串,但绝不可能产生字符串 。如果还能产生其他既不是 也不在 的字符串,也没关系。注意,两段程序中 指令的总数必须恰好为 。两段程序总指令数不得超过 200。
举例来说,若 ,,则程序 和 是一个合法答案。它们能产生 中的所有字符串,但无论如何交错都不可能产生 。(它们也能产生 ,但这既不是 也不在 ,这没关系。)而程序 和 不是合法答案,因为它们可能产生 。程序 和 也不是合法答案,因为它们无法产生 中的所有字符串。
你能否构造出满足条件的两段程序,或判断任务不可能完成(IMPOSSIBLE)?
Input Format
输入的第一行包含一个整数 ,表示测试用例数量。接下来有 组测试用例,每组三行。每组的第一行为两个整数 和 ,分别表示 中字符串数量,以及 和 中字符串的长度。第二行为 个长度为 的不同字符串,表示 。第三行为一个长度为 的字符串,表示不良字符串 。 和 中所有字符串仅由 和 组成。
Output Format
对于每组测试用例,若无法满足条件,输出一行 Case #x: IMPOSSIBLE,否则输出一行 Case #x: y z,其中 为测试用例编号(从 1 开始), 和 是你构造的两段程序。两段程序的总指令数不得超过 200,每段程序至少包含一条指令,且两段程序中 指令总数恰好为 。
3
2 2
10 00
11
3 2
11 10 00
01
4 2
00 01 10 11
11
Case #1: ? 10?1
Case #2: 1?? 0
Case #3: IMPOSSIBLE
Hint
样例解释
样例输出展示了一组可能答案,其他答案也可能是正确的。
样例第 1 组即为题面中的例子。
样例第 2 组不会出现在小数据集中。
样例第 3 组显然 IMPOSSIBLE,因为 就在 中。
限制条件
- 。
- 。
- 。
- 中所有字符串均不同。
小数据集(7 分,测试集 1 - 可见)
- 全部由 组成。
大数据集(28 分,测试集 2 - 隐藏)
- 可以是任意由 和/或 组成的字符串。
翻译由 GPT4.1 完成。
京公网安备 11011102002149号