Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

あみだくじ

PCK 君はみんなでゲーム大会をしています。このゲーム大会では、大会の最後にあみだくじで順位を入れ替えます。大会には N 人のプレイヤーが参加しており、あみだくじには N 本の縦棒があります。

あみだくじは、図のように N - 1 段の部品からできており、それぞれ 1 から N-1 の番号が割り当てられています。各部品は、あみだくじの一部を横方向に切り取った部分です。各部品にはいくつかの横棒が引かれていますが、部品の中の横棒はすべて同じ高さにあります。横棒同士がつながることはありません。

大会の最後に、順位の高い人から右から左の順に縦棒が割り当てられます。PCK 君は現時点で最下位なので、左端からスタートです。例えば、上図の組み立て方では、６位だったPCK 君は、このあみだくじによって４位（右から４番目の棒）に浮上することができます。

このゲームでは、最下位の人にあみだくじを組み立てる権利が与えられます。PCK 君はうまくあみだくじの部品の順番を決めて、逆転優勝を狙っています。ただし、部品を回転することはできません。

（※補足：あみだくじのたどり方について）

あみだくじのある縦棒の上端から出発して上から下へ進む。ただし、横棒がある地点ではその横棒でつながった別の縦棒に移動する。これを、縦棒の下端にたどり着くまで繰り返す。

ゲームの参加人数とあみだくじの部品の情報を入力し、PCK 君が優勝できるかどうか判定するプログラムを作成せよ。優勝できる場合、そのあみだくじの部品の並びを１つ出力せよ。ただし、そのような並べ方が複数ある場合は、与えられた部品の番号で辞書順最小のものを出力せよ。

Input

入力は以下の形式で与えられる。

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

１行目に大会の参加者数 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 を越えない。

Output

PCK 君が優勝できる場合，１行目に「yes」と出力する。続く N-1 行に、あみだくじの上から順に、部品の番号の並びを出力する。そのような並びが複数ある場合、辞書順最小である並びを出力する。PCK 君が優勝できない場合、１行に「no」と出力する。

Sample Input 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

Sample Output 1

yes
1
3
2
4
5

Sample Input 2

5
0 1 0 1
0 1 0 1
1 0 1 0
1 0 0 1

Sample Output 2

yes
4
1
3
2

4 1 3 2 と 4 2 3 1 の２通りの組み立て方が可能だが、辞書順で小さい方の 4 1 3 2 を出力する。

Sample Input 3

5
1 0 0 1
0 1 0 1
1 0 0 0
0 1 0 1

Sample Output 3

no

Solution in JAVA (judge verdict: Wrong Answer)

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.BitSet;
import java.util.stream.IntStream;

public class Main{
	public static void main(String[]$) throws IOException{
		new Main().solve();
	}
	static FastScanner s=new FastScanner(System.in);
	static IntStream REPS(int v){return IntStream.range(0,v);}
	static IntStream REPS(int l,int r){return IntStream.rangeClosed(l,r);}
	static int gInt() throws IOException{return s.nextInt();}
	static long gLong() throws IOException{return s.nextLong();}
	static long gDouble() throws IOException{return s.nextLong();}


	int n,usedno[];
	BitSet[]col;
	BitSet used=new BitSet();
	private void solve() throws IOException{
		n=gInt()-1;
		col=new BitSet[n];
		for(int i=0;i<n;++i) {
			col[i]=new BitSet();
		}
		for(int i=0;i<n;++i){
			for(int j=0;j<n;++j){
				col[j].set(i,gLong()==1);
			}
		}
		usedno=new int[n];
		if(search(n-1)) {
			System.out.println("yes");
			Arrays.stream(usedno).forEach(System.out::println);
			return;
		}
		System.out.println("no");
	}
	private boolean search(int curcol){
		if(curcol==-1)
			return true;
		for(int i=col[curcol].previousSetBit(n);i!=-1;i=col[curcol].previousSetBit(i-1)) if(!used.get(i)){
			usedno[curcol]=i+1;
			used.set(i);
			if(search(curcol-1))
				return true;
			used.clear(i);
		}
		return false;
	}


	static void yesno(boolean f) {
		yesno(f,"YES","NO");
	}
	static void yesno(boolean f,String yes,String no) {
		System.out.println(f?yes:no);
	}
}
class FastScanner{
	private final BufferedInputStream   in;
	private static final int			bufSize =1<<16;
	private final byte				  buf[]   =new byte[bufSize];
	private int						 i	   =bufSize;
	private int						 k	   =bufSize;
	private final StringBuilder		 str	 =new StringBuilder();

	FastScanner(InputStream in){
		this.in=new BufferedInputStream(in,bufSize);
	}
	int nextInt() throws IOException{
		return (int)nextLong();
	}
	long nextLong() throws IOException{
		int c;
		long x=0;
		boolean sign=true;
		while((c=nextChar())<=32)
			;
		if(c=='-'){
			sign=false;
			c=nextChar();
		}
		if(c=='+'){
			c=nextChar();
		}
		while(c>='0'){
			x=x*10+(c-'0');
			c=nextChar();
		}
		return sign?x:-x;
	}
	int nextChar() throws IOException{
		if(i==k){
			k=in.read(buf,0,bufSize);
			i=0;
		}
		return i>=k?-1:buf[i++];
	}
	String next() throws IOException{
		int c;
		str.setLength(0);
		while((c=nextChar())<=32&&c!=-1)
			;
		if(c==-1){
			return null;
		}
		while(c>32){
			str.append((char)c);
			c=nextChar();
		}
		return str.toString();
	}
	String nextLine() throws IOException{
		int c;
		str.setLength(0);
		while((c=nextChar())<=32&&c!=-1)
			;
		if(c==-1){
			return null;
		}
		while(c!='\n'){
			str.append((char)c);
			c=nextChar();
		}
		return str.toString();
	}
}