QOJ.ac

QOJ

时间限制: 1.0 s 内存限制: 2048 MB 总分: 100 交互

#17330. 洩漏聖誕老人的秘密

统计

聖誕節到了!當大多數工作場所都在進行秘密聖誕老人(Secret Santa)禮物交換時,你的工作場所正在策劃一個更邪惡的陰謀:揭開聖誕老人的秘密。

聖誕老人為地球上的每個人都準備了一份「淘氣或乖巧」名單。由於其內容非常敏感,該名單是用北極波蘭語(North-Polish)編寫的,這是一種擁有 $N$ 個字母的神秘語言。為了進一步保密,聖誕老人用一種代換密碼(substitution cipher)對這份名單進行了加密:這是一個數字 $1, 2, \dots, N$ 的排列 $H$,它將每個北極波蘭語字母 $i$ 對應到一個不同的字母 $H(i)$。在這樣的密碼中,沒有兩個字母會對應到同一個目標字母——形式上來說,若 $i \neq j$,則 $H(i) \neq H(j)$——否則聖誕老人將無法解讀他的名單!(聖誕老人可以選擇將某些字母對應到它們自身,即 $H(i) = i$,只是為了更狡猾一點。)

幸運的是,聖誕老人的伺服器編碼品質很差,且暴露在公共網際網路上。你和你的同事希望駭入聖誕老人的伺服器,解讀他的名單,並確認你們都是淘氣的!(駭客總是淘氣的。)

該伺服器的設計目的是讓聖誕老人可以隨時隨地快速檢查他的名單。在使用者連接到伺服器後,它會提示使用者輸入編碼排列 $H$ 的 $N$ 個整數 $H(1), H(2), \dots, H(N)$,驗證該列表是否正確,然後解讀聖誕老人的秘密名單。經過數月的研究,你發現了一個側通道計時漏洞。假設你輸入一個排列 $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$ 進行驗證。它不會因為你的輸入而以任何方式改變 $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$ 次。如果你用盡了嘗試次數,你的程式應乾淨地退出(儘管它會因為未能解讀聖誕老人的「淘氣或乖巧」名單而被判定為錯誤)。

說明

請務必在每次列印一行後重新整理輸出串流(flush the output stream),並在互動完成後乾淨地退出。請確保你嚴格遵守上述互動協定,關於在輸出的哪一行列印什麼資訊:例如,如果協定要求你在單行上列印一串以空格分隔的整數,評測系統將不接受每個整數佔用一行。

如果評測系統收到無效或意外的輸入,它將列印 $-1$ 然後立即退出。你的程式必須偵測到這一點並乾淨地退出,以獲得「答案錯誤」(Wrong Answer)的判定。如果你的程式在等待評測系統的進一步互動時阻塞,或者試圖將 $-1$ 解釋為連通分量的數量,你可能會收到不同的拒絕判定(例如「執行時間超時」(Time Limit Exceeded)或「執行階段錯誤」(Runtime Error))而不是「答案錯誤」。

你已獲得一個用於本地測試的命令列工具。該工具在頂部有註解說明其用法。

範例

範例 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.