QOJ.ac

QOJ

Límite de tiempo: 1.0 s Límite de memoria: 2048 MB Puntuación total: 100 Interactivo

#17330. 泄露圣诞老人的秘密

Estadísticas

圣诞节到了!当大多数工作场所都在进行秘密圣诞老人(Secret Santa)礼物交换时,你的工作场所正在酝酿一个更邪恶的计划:揭开圣诞老人的秘密。

圣诞老人为地球上的每个人都准备了一份“淘气或乖巧”名单。由于其内容非常敏感,该名单是用北波兰语(North-Polish)编写的,这是一种拥有 $N$ 个字母的神秘语言。为了进一步保密,圣诞老人用一种代换密码对这份名单进行了加密:一个数字 $1, 2, \dots, N$ 的置换 $H$,它将每个北波兰语字母 $i$ 映射到一个不同的字母 $H(i)$。在这种密码中,没有两个字母会映射到同一个目标字母——形式上,如果 $i \neq j$,则 $H(i) \neq H(j)$——否则圣诞老人将无法解密他的名单!(圣诞老人可以选择将某些字母映射到它们自身,即 $H(i) = i$,只是为了更狡猾一点。)

幸运的是,圣诞老人的服务器代码写得很糟糕,并且暴露在公共互联网上。你和你的同事希望入侵圣诞老人的服务器,解密他的名单,并确认你们都是淘气的!(黑客总是淘气的。)

该服务器的构建是为了让圣诞老人可以随时随地快速查看他的名单。在用户连接到服务器后,它会提示用户输入 $N$ 个整数 $H(1), H(2), \dots, H(N)$ 来编码置换 $H$,验证该列表是否正确,然后解密圣诞老人的秘密名单。经过数月的调查,你发现了一个侧信道计时漏洞。假设你输入了一个置换 $Q$。如果 $H = Q$,服务器会立即授予访问权限。否则,考虑一个具有 $N$ 个顶点的图,并从每个顶点 $i$ 到顶点 $H(Q(i))$ 添加一条边。你已经发现,服务器复杂的身份验证算法响应“访问被拒绝”(Access Denied)错误消息所花费的秒数,正好等于所得图中连通分量的数量。

例如,假设 $N = 4$,且密码置换 $H$ 如下:

$i$ 1 2 3 4
$H(i)$ 2 3 1 4

如果你尝试用输入 $4\ 3\ 2\ 1$ 登录服务器,由于该置换与 $H$ 不匹配,且上述图有两个连通分量(一个包含边 $1 \to 4 \to 2 \to 1$ 的循环,另一个仅包含自环 $3 \to 3$),服务器将在延迟 2 秒后响应“访问被拒绝”错误消息。

注意,如果你尝试多次使用不同的输入 $Q$ 登录服务器,它每次都会根据同一个存储的 $H$ 对 $Q$ 进行身份验证。它不会因为你的输入而以任何方式改变 $H$。

如果圣诞老人的服务器受到未经授权的请求轰炸,他会注意到。你估计你最多只能进行 $1\,510$ 次登录尝试,否则会引起过多的怀疑。你能找到一种确定密码置换的有效策略吗?

交互

这是一个交互式问题。交互开始时,从标准输入读取一个整数 $N$ ($1 \le N \le 220$),即北波兰语中的字母数量。评测机不是自适应的:隐藏的置换 $H$ 在此时被选定,并且在交互的其余部分中不会改变。

要尝试登录服务器,请打印一行包含 $N$ 个空格分隔的整数 $Q(1), \dots, Q(N)$,其中 $Q$ 是 $\{1, 2, \dots, N\}$ 的一个置换。然后从标准输入读取一个整数,即服务器响应你的输入所花费的时间(以秒为单位)。

如果此延迟为 0,则说明你已成功找到密码置换 $H$,你的程序应该终止。如果不是,此延迟是根据上述过程构建的图中连通分量的数量。

你最多可以尝试登录 $1\,510$ 次。如果你的尝试次数用尽,你的程序应该干净地退出(尽管它会被判定为错误,因为它未能解密圣诞老人的“淘气或乖巧”名单)。

说明

请记住在打印每一行后刷新输出流,并在交互完成后干净地退出。请确保你严格遵守上述交互协议,关于在输出的哪一行打印什么信息:例如,如果协议要求你在单行上打印一个空格分隔的整数列表,评测机将不会接受每个整数单独占一行。

如果评测机收到无效或意外的输入,它将打印 $-1$ 并立即退出。你的程序必须检测到这一点并干净地退出,以便获得“答案错误”(Wrong Answer)判决。如果你的程序阻塞等待评测机的进一步交互,或者试图将 $-1$ 解释为分量数量,你可能会收到不同的拒绝判决(例如“超出时间限制”或“运行时错误”),而不是“答案错误”。

你已经获得了一个用于本地测试的命令行工具。该工具在顶部有解释其用法的注释。

样例

样例 1

3
1 2 3
1
2 1 3
2
3 1 2
0

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.