QOJ.ac

QOJ

実行時間制限: 1.0 s メモリ制限: 2048 MB 満点: 100 インタラクティブ

#17330. サンタの秘密の漏洩

統計

クリスマスがやってきました!多くの職場が「秘密のサンタ(Secret Santa)」のプレゼント交換に参加する中、あなたの職場ではもっと邪悪な計画が進行しています。それは、サンタの秘密を暴くことです。

サンタは地球上のすべての人類に対して「良い子・悪い子リスト」を持っています。その内容は非常に機密性が高いため、リストは $N$ 個の文字からなる難解な言語「北ポーランド語」で書かれています。さらなるセキュリティのため、サンタはこのリストを換字式暗号で暗号化しました。これは $1, 2, \dots, N$ の置換 $H$ であり、各北ポーランド語の文字 $i$ を別の文字 $H(i)$ に写像するものです。このような暗号では、2つの文字が同じ対象文字に写像されることはありません。つまり、形式的に言えば $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))$ へ辺を張ります。あなたは、サーバーの複雑な認証アルゴリズムが「アクセス拒否」エラーメッセージを返すまでの時間が、結果として得られるグラフの連結成分の数と正確に一致することを発見しました。

例えば、$N = 4$ で暗号置換 $H$ が以下のようであるとします。

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

もし入力 $4\ 3\ 2\ 1$ でサーバーにログインしようとした場合、この置換は $H$ と一致せず、前述のグラフは2つの連結成分(辺 $1 \to 4 \to 2 \to 1$ からなるサイクルと、自己ループ $3 \to 3$ のみからなる成分)を持つため、サーバーは2秒の遅延の後に「アクセス拒否」エラーメッセージを返します。

異なる入力 $Q$ でサーバーに複数回ログインしようとしても、サーバーは毎回同じ保存された $H$ に対して $Q$ を認証することに注意してください。入力に応じて $H$ が変更されることはありません。

サンタは、サーバーが不正なリクエストで攻撃されていることに気づくでしょう。あなたは、疑いをかけられずにログインを試行できるのは最大 $1\,510$ 回までだと見積もりました。暗号置換を特定するための効率的な戦略を見つけることができますか?

インタラクション

これはインタラクティブな問題です。インタラクションは、標準入力から北ポーランド語の文字数である整数 $N$ ($1 \le N \le 220$) を読み取ることから始まります。ジャッジは適応型ではありません。隠された置換 $H$ はこの時点で決定され、インタラクションの残りの期間中変更されることはありません。

サーバーへのログインを試みるには、$Q$ が $\{1, 2, \dots, N\}$ の置換であるような $N$ 個のスペース区切りの整数 $Q(1), \dots, Q(N)$ を1行に出力してください。その後、標準入力から、サーバーが入力に応答するまでにかかる時間(秒数)である整数を1つ読み取ってください。

この遅延が $0$ であれば、あなたは暗号置換 $H$ を正常に発見したことになり、プログラムを終了すべきです。そうでなければ、この遅延は前述の手順に従って構築されたグラフの連結成分の数です。

ログインの試行は最大 $1\,510$ 回まで可能です。試行回数が尽きた場合、プログラムは正常に終了してください(ただし、サンタの「良い子・悪い子リスト」の解読に失敗したとして不正解と判定されます)。

注記

出力した各行の後に必ず出力ストリームをフラッシュし、インタラクション終了後に正常に終了することを忘れないでください。また、どの行にどのような情報を出力するかというインタラクションプロトコルに正確に従ってください。例えば、プロトコルがスペース区切りの整数のリストを1行で出力することを要求している場合、ジャッジは各整数が別々の行に出力されることを受け入れません。

ジャッジが無効または予期しない入力を受け取った場合、$-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.