Bitaro 和 Bibako 是考古学家,他们挖掘并调查了 JOI 王国的遗迹。在遗迹中,Bitaro 发现了一块古老的石板,Bibako 发现了一台古老的机器。
根据研究结果,Bitaro 发现石板上写着一个长度为 $N$ 的字符串 $S$。字符串中的每个字符要么是 ‘0’,要么是 ‘1’。然而,他目前还不知道字符串 $S$ 的具体内容。
另一方面,根据研究结果,Bibako 发现了如何使用这台机器。要使用它,我们需要将石板放在机器上,输入一个整数 $m$ 和两个整数序列 $a, b$,然后进行一次查询。这里,整数 $m$ 和序列 $a, b$ 应满足以下条件:
- 整数 $m$ 在 $1$ 到 $1\,002$ 之间(含 $1$ 和 $1\,002$)。
- 序列 $a$ 和 $b$ 的长度均等于 $m$。
- 序列 $a$ 和 $b$ 中的每个元素都是 $0$ 到 $m - 1$ 之间的整数(含 $0$ 和 $m - 1$)。
如果我们把石板放在机器上,输入整数 $m$ 和两个整数序列 $a, b$,并进行一次查询,机器将按以下方式运行并显示一个整数:
- 机器将内存区域设置为 $0$。
- 机器执行以下 $N$ 次操作。第 $(i + 1)$ 次操作($0 \le i \le N - 1$)按如下方式进行:
令 $x$ 为机器内存区域中当前设置的整数。机器读取字符 $S_i$。
这里,$S_i$ 是字符串 $S$ 的第 $i$ 个字符(从 $0$ 开始计数)。
- 如果 $S_i$ 是 ‘0’,机器将内存区域设置为 $a_x$。 这里,$a_x$ 是序列 $a$ 的第 $x$ 个元素(从 $0$ 开始计数)。
- 如果 $S_i$ 是 ‘1’,机器将内存区域设置为 $b_x$。 这里,$b_x$ 是序列 $b$ 的第 $x$ 个元素(从 $0$ 开始计数)。
- 机器显示最终设置在内存区域中的整数。
利用这台机器,Bitaro 想要确定写在石板上的字符串。然而,由于机器非常脆弱,查询次数不能超过 $1\,000$ 次。此外,输入到机器的整数 $m$ 的最大值应尽可能小。
请编写一个程序,利用这台机器确定写在石板上的字符串。
实现细节
你需要提交一个文件。
文件名为 ancient2.cpp。它应该实现以下函数。程序应使用预处理指令 #include 包含 ancient2.h。
std::string Solve(int N)该函数对每个测试用例仅调用一次。该函数应返回一个与写在石板上的字符串 $S$ 相同的字符串。- 参数 $N$ 是写在石板上的字符串 $S$ 的长度。
- 该函数应返回一个长度为 $N$ 的字符串。如果长度与 $N$ 不同,你的程序将被判为 Wrong Answer [1]。
- 返回值的每个字符必须是 ‘0’ 或 ‘1’。如果不满足此条件,你的程序将被判为 Wrong Answer [2]。
- 返回值应与写在石板上的字符串 $S$ 相同。如果不满足此条件,你的程序将被判为 Wrong Answer [3]。
你的程序可以调用以下函数:
int Query(int m, std::vector<int> a, std::vector<int> b)使用此函数,你的程序可以进行一次查询。- 参数 $m$ 是输入到机器的整数 $m$。
- 参数 $a, b$ 是输入到机器的两个整数序列 $a, b$。
- 返回值是当我们把石板放在机器上,输入上述整数和序列并进行查询时,机器显示的整数。
- 参数 $m$ 应在 $1$ 到 $1\,002$ 之间(含 $1$ 和 $1\,002$)。如果不满足此条件,你的程序将被判为 Wrong Answer [4]。
- 参数 $a, b$ 的长度均应等于 $m$。如果不满足此条件,你的程序将被判为 Wrong Answer [5]。
- 参数 $a, b$ 的每个元素应在 $0$ 到 $m - 1$ 之间(含 $0$ 和 $m - 1$)。如果不满足此条件,你的程序将被判为 Wrong Answer [6]。
- 函数
Query的调用次数不得超过 $1\,000$ 次。如果调用次数超过 $1\,000$ 次,你的程序将被判为 Wrong Answer [7]。
说明
- 你的程序可以实现其他内部函数,或使用全局变量。
- 你的程序不得使用标准输入和标准输出。你的程序不得以任何方式与其他文件通信。但是,你的程序可以将调试信息输出到标准错误。
编译与测试
你可以从竞赛网页下载包含示例评测程序的压缩包来测试你的程序。压缩包中还包含你的程序的示例源文件。
示例评测程序是 grader.cpp。为了测试你的程序,请将 grader.cpp、ancient2.cpp 和 ancient2.h 放在同一目录下,并运行以下命令来编译你的程序。或者,你可以运行压缩包中包含的 compile.sh。
g++ -std=gnu++17 -O2 -o grader grader.cpp ancient2.cpp
编译成功后,将生成可执行文件 grader。
请注意,实际的评测程序与示例评测程序不同。示例评测程序将作为一个单一进程执行,它会从标准输入读取数据并将结果写入标准输出。
数据范围
所有输入数据满足以下条件: $N = 1\,000$。 $S$ 是一个长度为 $N$ 的字符串。 * 字符串 $S$ 的每个字符要么是 ‘0’,要么是 ‘1’。
评分
如果你的程序在任何测试用例中被判为 Wrong Answer,则该任务得分为 $0$。
如果你的程序在所有测试用例中都被判为正确,则你的得分由所有测试用例中函数 Query 的参数 $m$ 的最大值 $M$ 计算得出。如果你的程序在不调用 Query 函数的情况下被判为正确,则得分按 $M = 0$ 计算。
- 如果 $103 \le M \le 1\,002$,你的得分为 $10 + \lfloor \frac{(1002-M)^2}{9000} \rfloor$ 分。
- 如果 $0 \le M \le 102$,你的得分为 $100$ 分。
这里 $\lfloor x \rfloor$ 是不超过 $x$ 的最大整数。
样例
假设写在石板上的字符串 $S$ 是 “110”。如果我们把石板放在机器上,输入 $(m, a, b) = (4, [3, 3, 2, 2], [2, 2, 1, 0])$,并进行查询,机器将按以下方式运行:
- 机器将内存区域设置为 $0$。
- 对于第一次操作,由于 $S_0$ 是 ‘1’,机器将内存区域设置为 $b_0$,即 $2$。
- 对于第二次操作,由于 $S_1$ 是 ‘1’,机器将内存区域设置为 $b_2$,即 $1$。
- 对于第三次操作,由于 $S_2$ 是 ‘0’,机器将内存区域设置为 $a_1$,即 $3$。
- 由于最终设置在内存区域中的整数是 $3$,机器显示 $3$。
请注意,此示例输入不满足 $N = 1\,000$ 的约束。
在可以从竞赛网页获得的压缩包文件中,sample-02.txt 满足该约束。