これはインタラクティブな問題です。
Little Cyan Fish は、$1$ から $n$ までの番号が付けられた $n$ 個の頂点からなる隠された単純無向グラフを持っています。あなたは $n$ の値を知っていますが、辺については一切知りません。Little Cyan Fish はカット(cut)という概念が大好きです。頂点集合 $S$ に対して、端点のちょうど一方が $S$ に含まれる辺の本数を $\operatorname{cut}(S)$ と表すことにします。
Little Cyan Fish は、あなたがクエリを送ることでカットの大きさを比較することを許してくれます。1 回のクエリでは、あなたは 2 つの頂点集合 $S_1$ と $S_2$ を選びます。すると Little Cyan Fish は、$\operatorname{cut}(S_1)$ が $\operatorname{cut}(S_2)$ より小さいか、等しいか、あるいは大きいかを教えてくれます。
おそらく次はグラフ全体を復元する話が続くだろうと予想しているかもしれませんが、今回の課題はそれより簡単です。Little Cyan Fish はあなたに頂点 $u$ を 1 つ与えます。彼の望みは、あなたが高々 $n + 10$ 回のクエリで $u$ に隣接するすべての頂点を見つけ出すことです。
入力
入力の 1 行目には、頂点の個数と与えられた頂点をそれぞれ表す 2 つの整数 $n$ と $u$($1 \le n \le 1000$、$1 \le u \le n$)が与えられます。その後、インタラクションが始まります。
インタラクション
クエリを送るには、以下の形式で 1 行出力してください。
$$?\ s_1\ s_2$$
ここで、$s_1$ と $s_2$ は文字 0 と 1 のみからなる長さ $n$ の文字列です。各 $j \in \{1, 2\}$ について、頂点 $i$ が $S_j$ に属することは、$s_j$ の $i$ 番目の文字が 1 であることと同値です。集合は空であってもよく、重なっていてもよく、また等しくても構いません。
クエリへの応答として、1 つの文字 <、=、または > が与えられます。これらはそれぞれ、$\operatorname{cut}(S_1)$ が $\operatorname{cut}(S_2)$ より小さいこと、等しいこと、または大きいことを意味します。クエリの回数が $n + 10$ を超えないようにしなければなりません。
答えを報告するには、以下の形式で 1 行出力してください。
$$!\ k\ v_1\ v_2\ \dots\ v_k$$
ここで、$k$($0 \le k \le n - 1$)は $u$ に隣接する頂点の個数であり、$v_1, v_2, \ldots, v_k$ はそれらの相異なる頂点番号(順序は任意)です。$k = 0$ の場合は、! 0 と出力してください。答えの報告はクエリの回数には含まれません。答えを報告した後、プログラムは直ちに終了しなければなりません。
クエリを出力した後、または答えを報告した後は、改行文字を出力し、出力ストリームをフラッシュすることを忘れないでください。不正なクエリを送った場合やクエリ回数の上限を超えた場合、インタラクタは入力ストリームを閉じますので、プログラムは直ちに終了しなければなりません。
この問題では、インタラクタは適応的(adaptive)です。つまり、これまでのどの応答とも矛盾しない限り、あなたのクエリに応じてグラフが変化する可能性があります。あなたの答えは、これまでに受け取ったすべての応答と矛盾しないあらゆるグラフに対して正しいものでなければなりません。
入出力例
入力 1
4 1 < = < =
出力 1
? 0000 1000 ? 0100 1100 ? 0010 1010 ? 0001 1001 ! 2 2 4
注記
入出力例のインタラクションと矛盾しないグラフの 1 つは、辺 $(1, 2)$、$(1, 4)$、および $(2, 3)$ を持ちます。
テストツール: 競技者が自身の解答を開発・テストするのを支援するため、テストツールが提供されています。このツールは添付ファイルからダウンロードできます。使用方法を表示するには、-h オプションを付けてツールを実行してください。このツールはインタラクションと報告された答えを検査しますが、実行時間制限やメモリ制限は強制しません。
テストツールはインタラクション全体を通して入力ファイルで指定された固定されたグラフを使用しますが、公式のインタラクタは適応的です。テストツールでのテストに通過したとしても、公式のインタラクタに対して解答が正しいことは保証されません。