入选国际信息学奥林匹克竞赛日本代表队的 JOI 酱,为了提高信息处理技术,被信息学奥林匹克日本委员会的 K 理事长提出了如下课题。
K 理事长在笔记本上写下了一个字符串 $S$,JOI 酱对此并不知情。$S$ 由 ‘<’, ‘>’, ‘[’, ‘]’ 这 4 种字符组成。K 理事长交给 JOI 酱一份打印件,上面写着课题内容和 $S$ 的长度。
JOI 酱的课题是判定 $S$ 是否为“好字符串”。在此,“好字符串”定义如下:
空字符串(即长度为 0 的字符串)是好字符串。
若 $x$ 是好字符串,则 $
例如,“$<>[]$” 和 “$[<>]<>$” 是好字符串,而 “$><$” 和 “$[<]>$” 不是好字符串。
JOI 酱每天正午最多可以给 K 理事长打一次电话。在电话中,通过指定整数 $I$,可以从 K 理事长那里获知 $S$ 的第 $I$ 个字符。
现在,JOI 酱被施加了一个重大限制:“在此课题中不得做笔记”。JOI 酱每晚 22 点睡觉,次日早晨 6 点起床,但在睡眠期间只能记住 22 比特的信息。更准确地说,在睡前必须记住一个 0 以上且 $2^{22} - 1$ 以下的整数,次日必须仅根据所记住的整数来处理课题。不过,由于 $S$ 的长度写在打印件上,因此可以随时查阅。
JOI 酱也可以选择在睡前不记住整数,而是通过电子邮件向 K 理事长回答 $S$ 是否为好字符串。在这种情况下,课题结束,并判定正误。但是,如果从课题开始起 15 000 天内没有发送电子邮件,则判定为错误。
课题
请实现 JOI 酱的策略,编写一个能够通过上述课题的程序。
实现细节
你必须编写一个实现 JOI 酱策略的程序。程序必须包含 Memory_lib.h。
程序必须实现以下函数:
int Memory(int N, int M)
该函数对应 JOI 酱在给定字符串 $S$ 的长度及所记住的整数时的当日行动。
- 参数 $N$ 是字符串 $S$ 的长度 $N$。
- 参数 $M$ 是前一天睡前记住的内容所表示的整数 $M$。注意,课题开始时视为记住了 $M = 0$。
- 在此函数中,可以调用最多 1 次下述的
Get函数。 - 此函数必须返回 0 以上且 $2^{22} - 1$ 以下的整数,或者返回 $-1$ 或 $-2$。如果返回该范围之外的值,则判定为错误 [1]。
- 返回值为 0 以上且 $2^{22} - 1$ 以下的整数时,表示睡前记住该值。
- 返回值为 $-1$ 时,表示通过电子邮件回答“$S$ 是好字符串”。
- 返回值为 $-2$ 时,表示通过电子邮件回答“$S$ 不是好字符串”。
- 该函数的行为预期仅依赖于参数 $N, M$ 的值以及所调用的
Get的返回值。此外,在实际的评分程序中,该函数会被调用 $2^{22} \times 4$ 次。详情请参阅“评分步骤”和“重要注意事项”。
程序中可以调用以下函数:
char Get(int I)
该函数在每次调用 Memory 时最多只能调用 1 次。如果调用 2 次以上,则判定为错误 [2]。
参数 $I$ 必须是满足 $1 \le I \le N$ 的整数 $I$。如果不满足此条件,则判定为错误 [3]。
该函数的返回值表示字符串 $S$ 的第 $I$ 个字符。
评分步骤
评分用的各输入数据由多个测试用例组成,在这些测试用例中,字符串 $S$ 的长度均为相同的值 $N$。
评分按以下步骤进行。如果被判定为错误,程序将在该时刻终止。
(1) 汇总调查对于参数 $N, M$ 的值以及 Get 的返回值的所有情况下 Memory 的行为。即,对于满足 $0 \le M \le 2^{22} - 1$ 的每个整数 $M$,执行以下操作:
(i) 将字符 $c$ 分别设为 ‘<’, ‘>’, ‘[’, ‘]’,执行以下操作:
以 $N$ 为参数 $N$,以 $M$ 为参数 $M$ 调用 Memory。此时,如果调用了 Get,则返回字符 $c$。将 Memory 的返回值记为 $m(M, c)$。
(ii) 在 (i) 的 4 次 Memory 调用中,是否调用 Get 必须相同。此外,如果调用了 Get,则 4 次必须都以相同的整数 $I$ 作为参数 $I$ 进行调用;如果未调用 Get,则 4 次必须返回相同的值。如果不满足这些条件,则判定为错误 [4]。将调用 Get 时的参数 $I$ 记为 $i(M)$(若未调用 Get,则设 $i(M) = 1$)。
(2) 针对各测试用例中的字符串 $S$,进行题目描述中所述课题的模拟。即,执行以下操作: (i) 设 $M = 0$。 (ii) 重复以下操作: (a) 设 $c$ 为 $S$ 的第 $i(M)$ 个字符。 (b) 将 $M$ 替换为 $m(M, c)$。 (c) 若 $M = -1$ 或 $M = -2$,则进入 (iii)。 (d) 若到达此步骤 15 000 次,则判定为错误 [5]。 (iii) 若满足以下任一情况,则判定为错误 [6]: $S$ 是好字符串,但 $M = -2$。 $S$ 不是好字符串,但 $M = -1$。
(3) 判定为正确。
重要注意事项
- 执行时间测量和内存使用测量对象是“评分步骤”中的步骤 (1)。请注意,在步骤 (1) 中
Memory会被调用 $2^{22} \times 4$ 次。 - 请注意,在步骤 (1) 的 $2^{22} \times 4$ 次所有
Memory调用中,不得出现错误 [1], [2], [3],也不得引发运行时错误。
数据范围
所有输入数据满足以下条件: $1 \le (S \text{ 的长度}) \le 100$。 $S$ 的每个字符均为 ‘<’, ‘>’, ‘[’, ‘]’ 中的任意一个。
子任务
- 子任务 1 [10 点]:满足 $(S \text{ 的长度}) \le 8$。
- 子任务 2 [10 点]:满足 $(S \text{ 的长度}) \le 14$。
- 子任务 3 [5 点]:满足 $(S \text{ 的长度}) \le 24$。
- 子任务 4 [5 点]:满足 $(S \text{ 的长度}) \le 30$。
- 子任务 5 [10 点]:$S$ 的每个字符均为 ‘<’, ‘>’ 中的任意一个。
- 子任务 6 [60 点]:无附加限制。
样例
输入格式 1
4 1 <>[]
输出格式 1
-1
说明
以上展示了 grader-simple 读取的输入示例以及对应的函数调用示例。当进行交互时,grader-simple 输出 -1。