あなたは Red Dragon Syndicate のデータ端末に侵入しています。端末のアーカイブ $S$ には、初期状態で $n$ 個の暗号化された信号周波数が含まれており、それぞれは長さ $k$ のバイナリ文字列として表現されています。これらの初期周波数は、端末のメモリから抽出された正確な順序で $1$ から $n$ までインデックスが付けられています。コアに侵入するには、新しい周波数を合成し、アーカイブに注入する必要があります。各合成操作は、$S$ にちょうど1つの新しいバイナリ文字列を追加し、次に利用可能な整数インデックスを自動的に割り当てます。
あなたは次の2つの操作を装備しています:
- 位相反転 (Phase Inversion): 既存の周波数 $s$ を選択し、その正確なビットごとの補数を追加します ($s$ を長さ $k$ のバイナリ文字列とし、$s = s_1 s_2 \dots s_k$、各ビット $s_i \in \{0, 1\}$ とします。$s$ のビットごとの補数は、数学的には $\neg s$ と表記されることが多く、$i$ 番目のビットの値が正確に $1 - s_i$ となる長さ $k$ の新しいバイナリ文字列として定義されます)。
- 信号三角測量 (Signal Triangulation): 3つの既存の周波数 $u$, $v$, $w$ (必ずしも異なる必要はありません) を選択し、それらのビットごとの多数決を追加します。これは $\operatorname{maj}(u,v,w)$ と表記されます。各ビット位置 $i$ について、操作は次のように評価されます: $$\operatorname{maj}(u,v,w)_i = \operatorname{maj}(u_i,v_i,w_i).$$ 個々のビット $a$, $b$, $c$ について、$\operatorname{maj}(a,b,c)$ は、少なくとも2つが $1$ ならば $1$、そうでなければ $0$ となります。
あなたの目的は、特定の目標となる賞金コード $t$ (長さ $k$) を偽造できるかどうかを判断することです。可能であれば、それを正常に構築するための操作列 (最大 $10^5$ 回) を提供する必要があります。
入力
端末フィードの最初の行には、2つの整数 $n$ と $k$ ($1 \le n, k \le 200$) が含まれ、初期コードの数と各コードの長さを表します。
次の $n$ 行のそれぞれには、長さ $k$ のバイナリ文字列 (0 と 1) が含まれ、現在アーカイブにあるコードを示します。
最後の行には、偽造する必要がある目標の賞金コードを表す、長さ $k$ の単一のバイナリ文字列 $t$ が含まれます。
出力
目標コード $t$ を偽造することが不可能な場合は、NO とだけ書かれた1行を出力してください。
それ以外の場合は、YES を出力してください。次の行に、使用する操作の総数を表す整数 $m$ ($0 \le m \le 10^5$) を出力してください。その後、操作を順に記述した $m$ 行を出力してください:
1 x: インデックス $x$ の既存のコードを選び、位相反転を適用します ($x$ のビットごとの補数を追加します)。2 x y z: インデックス $x$, $y$, $z$ の既存のコードを選び、信号三角測量を適用します (既存の文字列 $x$, $y$, $z$ の $\operatorname{maj}$ を追加します)。
使用するすべてのインデックスは、使用する時点でアーカイブに存在していなければなりません。$m$ 回の操作の後、アーカイブ内の少なくとも1つのコードが目標 $t$ と完全に一致していなければなりません。目標コード $t$ がすでに最初のアーカイブに存在する場合は、単に $m = 0$ と出力することができます。
コードを偽造する正しい方法が複数ある場合は、有効な操作シーケンスのいずれかを出力してください。
入出力例
入力例 1
3 4 1000 0100 0010 1111
出力例 1
YES 4 1 1 1 2 1 3 2 4 5 6
注記
- 最初の3操作は、初期文字列の補数を追加し、
0111、1011、1101を生成します。 - 最後の操作は、これら3つの文字列のビットごとの多数決を取ります。
- すべての位置で少なくとも2つの文字列がビット $1$ を持つため、追加される文字列は
1111となり、これが目標です。