CF1286C2 Madhouse (Hard version)

题目描述

本题与简单版本的区别仅在于对所有答案总长度的限制。 这是一个交互题。 Venya 参加了一个疯人院之旅,护工们和病人们玩如下的游戏。护工们选择一个长度为 $n$ 的字符串 $s$,该字符串仅由小写英文字母组成。玩家可以进行两种类型的查询: - ? l r —— 询问 $s[l..r]$ 的所有子串。所有子串将以随机顺序返回,并且每个子串中的所有字符也会被随机打乱。 - ! s —— 猜测护工们选定的字符串。该查询只能进行一次,之后游戏结束。如果猜测正确,玩家获胜,否则失败。 玩家最多只能进行 $3$ 次第一种类型的查询。 为了方便护工们,还有一个额外限制:所有第一种类型查询返回的子串总数不得超过 $\left\lceil 0.777(n+1)^2 \right\rceil$($\lceil x \rceil$ 表示对 $x$ 向上取整)。 Venya 请你编写一个程序,通过与护工们的程序交互,并按照游戏规则猜出字符串。 你的程序在使用第二种类型的查询猜测字符串后应立即终止。如果猜测错误,或违反了游戏规则,将会收到 Wrong answer 的判定。 注意,每个测试用例中的字符串在游戏开始前已固定,游戏过程中不会改变,也就是说交互器是非自适应的。

输入格式

第一行包含一个整数 $n$($1 \le n \le 100$),表示被选中的字符串的长度。

输出格式

你需要通过读取 $n$ 开始交互。 若要查询从 $l$ 到 $r$($1 \le l \le r \le n$)的子串,应在单独一行输出: ? l r 随后将返回 $s[l..r]$ 的所有子串,顺序随机,每个子串中的字符也会被随机打乱。 如果你的查询不合法,或进行了超过 $3$ 次第一种类型的查询,或所有查询返回的子串总数超过 $\left\lceil 0.777(n+1)^2 \right\rceil$,你将收到 Wrong answer 的判定。 若要猜测字符串 $s$,应在单独一行输出: ! s 每次输出查询后,别忘了刷新输出缓冲区,否则会收到 Idleness limit exceeded 的判定。刷新方法如下: - C++:fflush(stdout) 或 cout.flush() - Java:System.out.flush() - Pascal:flush(output) - Python:stdout.flush() - 其它语言请查阅相关文档。 如果你收到 -(短横线)作为任何查询的回复,需立即以退出码 0 终止程序(例如调用 exit(0))。这表示交互协议出现错误。如果不这样做,可能会收到任意失败判定。 Hack 格式 如需 Hack 某个解法,使用如下格式: 第一行输入一个整数 $n$($1 \le n \le 100$),第二行输入字符串 $s$。

说明/提示

由 ChatGPT 4.1 翻译