Problem:
パズル

1 〜 9 の数字を 14 個組み合わせて完成させるパズルがあります。与えられた 13 個の数字にもうひとつ数字を付け加えて完成させます。

パズルの完成条件は

同じ数字を２つ組み合わせたものが必ずひとつ必要です。

残りの12 個の数字は、３個の数字の組み合わせ４つです。

３個の数字の組み合わせ方は、同じ数字を３つ組み合わせたものか、または３つの連続する数字を組み合わせたものです。ただし、9 1 2 のような並びは連続する数字とは認められません。

同じ数字は4 回まで使えます。

13 個の数字からなる文字列を読み込んで、パズルを完成することができる数字を昇順に全て出力するプログラムを作成してください。なお、1〜9 のどの数字を付け加えてもパズルを完成させることができないときは 0 を出力してください。

例えば与えられた文字列が 3456666777999 の場合

「2」があれば、　234 567 666 77 999

「3」があれば、　33 456 666 777 999

「5」があれば、　345 567 666 77 999

「8」があれば、　345 666 678 77 999

というふうに、2 3 5 8 のいずれかの数字が付け加えられるとパズルは完成します。「6」でも整いますが、5 回目の使用になるので、この例では使えないことに注意してください。

Input

入力は複数のデータセットからなります。各データセットとして、13 個の数字が１行に与えられます。データセットの数は 50 を超えません。

Output

データセットごとに、パズルを完成させることができる数字を昇順に空白区切りで１行に出力します。

Sample Input

3649596966777
6358665788577
9118992346175
9643871425498
7755542764533
1133557799246

Output for the Sample Input

2 3 5 8
3 4
1 2 3 4 5 6 7 8 9
7 8 9
1 2 3 4 6 7 8
0

Solution in JAVA (judge verdict: Wrong Answer)

import java.io.*;
import java.util.Arrays;

class Main {
	public static void main(String args[]) {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String buf;

		try {
			while ((buf = br.readLine())!=null) {
				int n[] = new int[13];
				int s1[] = new int[14];
				int s2[] = new int[14];

				for (int i=0;i<13;i++) n[i] = Character.getNumericValue(buf.charAt(i));
				Arrays.sort(n);

				boolean First = true;
				for (int i=1;i<=9;i++) {
					for (int j=0;j<13;j++) {
						s1[j] = n[j];
						s2[j] = n[j];
					}
					s1[13] = i;
					s2[13] = i;
					Arrays.sort(s1);
					if (NotAccept(s1)) continue;
					Arrays.sort(s2);
					for (int j=1;j<=9;j++) {
						if (removeTwo(s1,j)) {
							for (int k=1;k<=9;k++) {
								removeThree(s1,k);
							}
							for (int k=1;k<=7;k++) {
								removeStraight(s1,k);
								removeStraight(s1,k);
							}
							//System.out.println("i = "+i);
							//for (int k=0;k<14;k++) System.out.print(s1[k]);
							//System.out.print(" ");
							//for (int k=0;k<14;k++) System.out.print(s2[k]);
							//System.out.println("");
							if (s1[0]==10) {
								if (First) {
									System.out.print(i);
									First = false;
								} else {
									System.out.print(" "+i);
								}
								break;
							} else {
								for (int k=0;k<14;k++) s1[k] = s2[k];
								removeTwo(s1,j);
								for (int k=1;k<=7;k++) {
									removeStraight(s1,k);
									removeStraight(s1,k);
								}
								for (int k=1;k<=9;k++) {
									removeThree(s1,k);
								}
								//System.out.println("reverse i = "+i);
								//for (int k=0;k<14;k++) System.out.print(s1[k]);
								//System.out.print(" ");
								//for (int k=0;k<14;k++) System.out.print(s2[k]);
								//System.out.println("");
								if (s1[0]==10) {
									if (First) {
										System.out.print(i);
									} else {
										System.out.print(" "+i);
									}
									break;
								}
							}
							for (int k=0;k<14;k++) s1[k] = s2[k];
						}
					}
				}
				if (First) System.out.println(0);
				else System.out.println("");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static boolean NotAccept(int s[]) {
		for (int i=1;i<=9;i++) {
			for (int j=0;j<10;j++) {
				if (s[j]==i&&s[j+1]==i&&s[j+2]==i&&
					s[j+3]==i&&s[j+4]==i) return true;
			}
		}
		return false;
	}

	public static boolean removeTwo(int s[],int n) {
		for (int i=0;i<13;i++) {
			if (s[i]==n&&s[i+1]==n) {
				s[i] = s[i+1] = 10;
				Arrays.sort(s);
				return true;
			}
		}
		return false;
	}

	public static boolean removeThree(int s[],int n) {
		for (int i=0;i<12;i++) {
			if (s[i]==n&&s[i+1]==n&&s[i+2]==n) {
				s[i] = s[i+1] = s[i+2] = 10;
				Arrays.sort(s);
				return true;
			}
		}
		return false;
	}

	public static boolean removeStraight(int s[],int n) {
		if (s[0]==n&&s[1]==n+1&&s[2]==n+2) {
			s[0] = s[1] = s[2] = 10;
			Arrays.sort(s);
			return true;
		} else {
			if (s[0]==n&&s[2]==n+1&&s[4]==n+2) {
				s[0] = s[2] = s[4] = 10;
				Arrays.sort(s);
				return true;
			} else if (s[0]==n&&s[1]==n+1&&s[3]==n+2) {
				s[0] = s[1] = s[3] = 10;
				Arrays.sort(s);
				return true;
			} else if (s[0]==n&&s[2]==n+1&&s[3]==n+2) {
				s[0] = s[2] = s[3] = 10;
				Arrays.sort(s);
				return true;
			}
		}
		return false;
	}

	/*public static boolean removeStraight(int s[],int n) {
		for (int i=0;i<12;i++) {
			if (s[i]==n&&s[i+1]==n+1&&s[i+2]==n+2) {
				s[i] = s[i+1] = s[i+2] = 10;
				Arrays.sort(s);
				return true;
			} else {
				if (i<10&&s[i]==n&&s[i+2]==n+1&&s[i+4]==n+2) {
					s[i] = s[i+2] = s[i+4] = 10;
					Arrays.sort(s);
					return true;
				} else if (i<11&&s[i]==n&&s[i+1]==n+1&&s[i+3]==n+2) {
					s[i] = s[i+1] = s[i+3] = 10;
					Arrays.sort(s);
					return true;
				} else if (i<11&&s[i]==n&&s[i+2]==n+1&&s[i+3]==n+2) {
					s[i] = s[i+2] = s[i+3] = 10;
					Arrays.sort(s);
					return true;
				}
			}
		}
		return false;
	}*/
}