# 子串询问恢复排列 时间限制:0.5 秒。内存限制:128 MiB。参考 [评测环境与性能](../../../docs/评测环境与性能.md)。 ## 背景故事 档案柜隐藏着一列编号。终端不直接显示这列编号,但会比较你提交的编号串与隐藏序列,返回最长连续匹配的长度。利用有限次数的比较恢复整列编号。 (本故事由GPT-6重写) ## 形式化问题描述 这是一道交互题。评测器在交互开始前固定一个 $1,\ldots,n$ 的排列 $p$ ,其中 $1\le n\le120$ . 你可询问一个长度 $1\le k\le100$ 的整数序列 $q$ ,每项都在 $[1,n]$ 内,允许重复。评测器返回 $q$ 与 $p$ 的最长公共**连续子串**长度:最大的 $d$ ,使某段连续的 $d$ 个元素在两个序列中完全相同。没有公共元素时该值为零。顺序必须相同,不是子序列,也不把排列首尾相接。 最多询问800次,最后报告整个排列。最终报告不计作询问。 ## 输入格式 程序首先读取一个整数 $n$ .每次发送合法询问并刷新输出后,读取一个整数回复。收到 $-1$ 或输入结束时应立即退出。隐藏排列不会作为提交程序的输入提供。 ## 输出格式 询问输出一行 ` ? k q_1 ... q_k` ;最终输出一行 ` ! p_1 ... p_n` ,随后退出。每行发送后必须刷新输出。长度、值域、格式或询问次数非法,以及最终排列错误,均判为失败。 下面的样例用于随题本地交互器:输入文件包含 $n$ 和隐藏排列,输出块列出应恢复的排列。它们不是可以直接重定向给 `std.cpp` 的交互输入流。运行方式见[本地测试说明](tests/README.md)。 ## 样例 1 ### 输入 ```text 1 1 ``` ### 输出 ```text 1 ``` ## 样例 2 ### 输入 ```text 4 2 1 4 3 ``` ### 输出 ```text 2 1 4 3 ``` ## 样例 3 ### 输入 ```text 3 3 2 1 ``` ### 输出 ```text 3 2 1 ``` ## 样例解释 样例2隐藏 $[2,1,4,3]$ .询问 ` ? 5 1 2 1 4 1` 会得到3,因为连续串 $[2,1,4]$ 同时出现。最终报告为 ` ! 2 1 4 3` . ![重复枢轴1的询问可以检查候选编号是否与1相邻;匹配是连续且有方向的。](assets/example.svg) 重复枢轴1的询问可以检查候选编号是否与1相邻;匹配是连续且有方向的。 ## 数据范围与保证 $1\le n\le120$ .每次询问长度不超过100,总询问次数不超过800。 规格重新设计:Codex(GPT-6);补全文本交互协议、刷新及终止规则、本地隐藏数据格式。 | 分值 | 额外限制 | | --- | --- | | 20% | $n\le8$ | | 30% | $n\le50$ | | 50% | 无额外限制 |