CF2013C Password Cracking
题目描述
迪马什得知曼苏尔向朋友泄露了一些关于他的不愉快言论,于是他决心揭开曼苏尔的密码,看看具体内容是什么。
曼苏尔对自己的密码充满信心,他表示自己的密码是一个长度为 $ n $ 的二进制字符串。同时,他愿意回答迪马什的问题:
迪马什可以给出一个二进制字符串 $ t $ ,曼苏尔则回答 $ t $ 是否是他的密码的一个子串(即一段连续的字符序列)。
请帮助迪马什在不超过 $ 2n $ 次询问内猜出密码;否则,曼苏尔将识破伎俩并停止与他交流。
输入格式
输入包含多个测试用例。第一行包含一个整数 $ t $ ,表示测试用例的数量($ 1 \le t \le 100 $)。接下来描述每个测试用例。
输出格式
每个测试用例一开始,读取一个整数 $ n $ ,表示二进制字符串的长度($ 1 \le n \le 100 $)。然后开始猜测这个字符串。
在猜测字符串 $ s $ 的过程中,你可以进行不超过 $ 2n $ 次以下类型的查询:
- "? $ t $",其中 $ t $ 是满足 $ 1 \le |t| \le n $ 的二进制字符串。
对于每次查询,你将收到一个结果:如果 $ t $ 是 $ s $ 的子串,返回 $ 1 $;否则返回 $ 0 $。
一旦确认了密码字符串 $ s $,输出格式如下:
- "! $ s $",其中 $ s $ 是长度为 $ n $ 的二进制字符串。
完成一个测试用例后,继续下一个测试用例的解答。
如果在过程中发生错误尝试或超过 $ 2n $ 次查询限制,将收到 $ -1 $ 作为回应,并被判定为“错误答案”。此时程序应立即终止,以避免未定义的结果。
记得在输出查询结果之后,添加一个换行并刷新输出缓冲区,否则程序会被判定为“程序挂起”。常用的刷新缓冲方法如下:
- C++ 中使用 `fflush(stdout)` 或 `cout.flush()`
- Java 中使用 `System.out.flush()`
- Pascal 中使用 `flush(output)`
- Python 中使用 `sys.stdout.flush()`
- 其他语言请参考相关文档进行操作。
### 数据范围与提示
举例说明:对于字符串 $ 010 $ ,查询的结果是:
- "? 00"——因为 $ 00 $ 不是 $ 010 $ 的子串,所以结果是 $ 0 $。
- "? 000"——因为 $ 000 $ 不是子串,结果是 $ 0 $。
- "? 010"——因为 $ 010 $ 是子串,结果是 $ 1 $。
在以下示例中,字符串分别为 $ 1100 $ 、 $ 0110 $ 和 $ 10 $。
**本翻译由 AI 自动生成**
说明/提示
In the first example, the string $ 010 $ is given. Therefore, the answers to the queries are as follows:
"? 00" $ 00 $ is not a substring of $ 010 $ , so the answer is $ 0 $ .
"? 000" $ 000 $ is not a substring, so the answer is $ 0 $ .
"? 010" $ 010 $ is a substring, so the answer is $ 1 $ .
In the second example, the string is $ 1100 $ , in the third $ 0110 $ , and in the fourth $ 10 $ .