010 - あみだくじ
時間制限 2 秒 / メモリ制限 256 MB / 得点 16 / x 1 /
PCK 君はみんなでゲーム大会をしています。このゲーム大会では、大会の最後にあみだくじで順位を入れ替えます。大会には N 人のプレイヤーが参加しており、あみだくじには N 本の縦棒があります。
あみだくじは、図のように N - 1 段の部品からできており、それぞれ 1 から N-1 の番号が割り当てられています。各部品は、あみだくじの一部を横方向に切り取った部分です。各部品にはいくつかの横棒が引かれていますが、部品の中の横棒はすべて同じ高さにあります。横棒同士がつながることはありません。
大会の最後に、順位の高い人から右から左の順に縦棒が割り当てられます。PCK 君は現時点で最下位なので、左端からスタートです。例えば、上図の組み立て方では、6位だったPCK 君は、このあみだくじによって4位(右から4番目の棒)に浮上することができます。
このゲームでは、最下位の人にあみだくじを組み立てる権利が与えられます。PCK 君はうまくあみだくじの部品の順番を決めて、逆転優勝を狙っています。ただし、部品を回転することはできません。
(※補足:あみだくじのたどり方について)
あみだくじのある縦棒の上端から出発して上から下へ進む。ただし、横棒がある地点ではその横棒でつながった別の縦棒に移動する。これを、縦棒の下端にたどり着くまで繰り返す。
ゲームの参加人数とあみだくじの部品の情報を入力し、PCK 君が優勝できるかどうか判定するプログラムを作成せよ。優勝できる場合、そのあみだくじの部品の並びを1つ出力せよ。ただし、そのような並べ方が複数ある場合は、与えられた部品の番号で辞書順最小のものを出力せよ。
入力
入力は以下の形式で与えられる。
N b1,1 b1,2 ... b1,N−1 b2,1 b2,2 ... b2,N−1 : bN−1,1 bN−1,2 ... bN−1,N−1
1行目に大会の参加者数 N (2 ≤ N ≤ 500) が与えられる。続く N-1 行に i 番目の部品の横棒の情報が与えられる。bi,j が 1 であるとき、i 番目の部品の、左から j 本目の縦棒から j+1 番目の縦棒へ横棒が引かれていることを表す。bi,j が 0 であるとき、i 番目の部品の、左から j 本目の縦棒から j+1 番目の縦棒へ横棒は引かれていないことを表す。bi,j が 1 であるとき、bi,j+1 が 1 となるような部品は与えられない。また、横棒の総数は 10000 を越えない。
出力
PCK 君が優勝できる場合,1行目に「yes」と出力する。続く N-1 行に、あみだくじの上から順に、部品の番号の並びを出力する。そのような並びが複数ある場合、辞書順最小である並びを出力する。PCK 君が優勝できない場合、1行に「no」と出力する。
入力例 1
6 1 0 0 0 1 1 0 1 0 1 0 1 0 1 0 0 0 0 1 0 0 1 0 0 1
出力例 1
yes 1 3 2 4 5
入力例 2
5 0 1 0 1 0 1 0 1 1 0 1 0 1 0 0 1
出力例 2
yes 4 1 3 2
4 1 3 2 と 4 2 3 1 の2通りの組み立て方が可能だが、辞書順で小さい方の 4 1 3 2 を出力する。
入力例 3
5 1 0 0 1 0 1 0 1 1 0 0 0 0 1 0 1
出力例 3
no