Problem:
Problem C: ラミー

あなたの友達は最近 UT-Rummy というカードゲームを思いついた．

このゲームで使うカードには赤・緑・青のいずれかの色と1から9までのいずれかの番号が
つけられている．
このゲームのプレイヤーはそれぞれ9枚の手札を持ち，
自分のターンに手札から1枚選んで捨てて，
代わりに山札から1枚引いてくるということを繰り返す．
このように順番にターンを進めていき，
最初に手持ちのカードに3枚ずつ3つの「セット」を作ったプレイヤーが勝ちとなる．
セットとは，同じ色の3枚のカードからなる組で，すべて同じ数を持っているか
連番をなしているもののことを言う．
連番に関しては，番号の巡回は認められない．
例えば，7, 8, 9は連番であるが 9, 1, 2は連番ではない．

あなたの友達はこのゲームをコンピュータゲームとして売り出すという計画を立てて，
その一環としてあなたに勝利条件の判定部分を作成して欲しいと頼んできた．
あなたの仕事は，手札が勝利条件を満たしているかどうかを判定する
プログラムを書くことである．

Input

入力の1行目にはデータセット数を表す数 T
(0 < T ≤ 50) が与えられる．
この行に引き続き T 個のデータセットが与えられる．

各データセットは2行からなり，
1行目には i 番目
(i = 1, 2, ..., 9)
のカードの数字 ni
がそれぞれスペースで区切られて与えられ，
2行目には i 番目のカードの色を表す文字
ci
がそれぞれスペースで区切られて与えられる．
カードの数字
ni
は 1 ≤ ni ≤ 9
を満たす整数であり，
カードの色 ci
はそれぞれ “R”, “G”,
“B”
のいずれかの文字である．

1つのデータセット内に色と数字がともに同じカードが5枚以上出現することはない．

Output

各データセットにつき，勝利条件を満たしていれば
“1”，
そうでなければ “0” と出力せよ．

Sample Input

5
1 2 3 3 4 5 7 7 7
R R R R R R G G G
1 2 2 3 4 4 4 4 5
R R R R R R R R R
1 2 3 4 4 4 5 5 5
R R B R R R R R R
1 1 1 3 4 5 6 6 6
R R B G G G R R R
2 2 2 3 3 3 1 1 1
R G B R G B R G B

Output for the Sample Input

1
0
0
0
1

Solution in JAVA (judge verdict: Accepted)



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

/**
 * <pre>
 *
 *AOJ Rummy?????????????????????????????????????????????????????°
 *
 *?????????????????????????????°??????
 * ????????????????????????????????°(?°?????¨??????´)
 * ????????????
 * ??¢ ??????(?¬??????????)?????¨??????(?????´???)
 *
 * ??????????\?????§???????14???38???
 *
 * ??? ??°??????????????????????????¨?????´???
 * ??? ?????????????????????????????????
 * ??¢ ???????¢????
 * ??£ ????§?????????????????????????
 * ??? ??°??????????????????
 * ??\ ???????¢????
 * ???????????????????\?
 * ??§ ???????????????????????°??????
 * </pre>
 *
 * @author ??????
 * @category AOJRummy
 * @version 1.8_45
 * @since 1.8_45
 *
 */
public class Main{

	/**
	 * ????????°????????????3????????????????????°?????¶???
	 */
	private static final int TRIPLESET = 9;

	/**
	 * ?????¶??????????????????????????????????????????????????????
	 */
	private static final String ZERO = "0";

	/**
	 * ??????for??????????????????????¨?????????????????????????????????????????????????????????°
	 */
	private static final int ADDRESSPLUSZERO = 0;

	/**
	 * ??????for??????????????????????¨?????????????????????????????????????????????????????????°
	 */
	private static final int ADDRESSPLUSONE = 1;

	/**
	 * ??????for??????????????????????¨?????????????????????????????????????????????????????????°
	 */
	private static final int ADDRESSPLUSTWO = 2;

	/**
	 * ??????????????§BufferedReader?????????
	 *
	 * @throws NumberFormatException
	 *
	 * @throws IOException
	 *             try-catch???????????????throws IOException?????£?¨??????????
	 */
	public static void main(String[] args) throws IOException {

		// ?????????????????????
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		// ?????????????´???´???
		ArrayList<Integer> answer = new ArrayList<Integer>();

		// 1??????????????????set?????°??????????????°
		int set = Integer.parseInt(br.readLine());

		// ????????????????´???´???
		ArrayList<UTRummyCard> cardArr = new ArrayList<UTRummyCard>();

		// for????????? set????????°?????????
		for (int cnt1 = ADDRESSPLUSZERO; cnt1 < set; cnt1++) {

			// ??????????????°??????????????¨????????????
			String tmpNum = br.readLine();
			// ??????????????????????????¨????????????
			String tmpColor = br.readLine();

			// ???????????????????????????
			inputTheCardArr(cardArr, tmpNum, tmpColor);

			/**
			 * ???????????¶??????????????°??? ????????????????????°0
			 */
			// result????????????????????????????´???´???
			int result = utRummy(cardArr);
			// ?????????????´?
			answer.add(result);

			// ??¢??¬????????????????????????????????§??????????????§?????????????\?
			cardArr.clear();
		}
		// for????????? ??????????????????????????????
		for (int cnt = ADDRESSPLUSZERO; cnt < answer.size(); cnt++) {
			// ???????????????
			System.out.println(answer.get(cnt));
		}
	}// ?????????????????????????????????

	/**
	 *
	 *
	 * @param cardArr
	 * @param transNum
	 * @param transColor
	 */
	private static void inputTheCardArr(ArrayList<UTRummyCard> cardArr, String tmpNum, String tmpColor) {

		// ?????°???????§£ ??°??????????´?
		String[] transNum = tmpNum.split(" ");
		// ?????°???????§£ ??????????´?
		String[] transColor = tmpColor.split(" ");

		/**
		 * ?????¶??? ??±??????????????°?????????????????????????????´??? ??±?????????????????????????????°??????????????´???
		 *
		 * ?????????????????¨?????¨?????????????????\??? ??????????¨???¨?????§.equals()???.contains()????????¨???????????????????????´????????????????????????
		 *
		 */
		String swi = (transNum.length >= transColor.length) ? "LongNum" : "LongColor";
		// ???????????????????????£???
		switch (swi) {
		case "LongNum":
			caseOne(cardArr, transNum, transColor);
			break;

		case "LongColor":
			caseTwo(cardArr, transNum, transColor);
			break;

		default:
			System.out.println("??¨????????????");
			break;
		}
	}

	private static void caseOne(ArrayList<UTRummyCard> cardArr, String[] transNum, String[] transColor) {
		// ??°???, ?????????????????????
		for (int cnt2 = ADDRESSPLUSZERO; cnt2 < transNum.length; cnt2++) {
			// ??±?????????
			if (cnt2 >= transColor.length) {
				// ???????????????????????¨?????¨??????????????????????????\
				cardArr.add(new UTRummyCard(Integer.parseInt(transNum[cnt2]), ZERO));
			} else {
				// ????´??????????????????????????????????????????????
				cardArr.add(new UTRummyCard(Integer.parseInt(transNum[cnt2]), transColor[cnt2]));
			}
		}
	}

	private static void caseTwo(ArrayList<UTRummyCard> cardArr, String[] transNum, String[] transColor) {
		for (int cnt2 = 0; cnt2 < transColor.length; cnt2++) {
			// ??±?????????
			if (cnt2 >= transNum.length) {
				// ??°???????????????????????¨?????¨????????°?????????????????\
				cardArr.add(new UTRummyCard(ADDRESSPLUSZERO, transColor[cnt2]));
			} else {
				// ????´??????????????????????????????????????????????
				cardArr.add(new UTRummyCard(Integer.parseInt(transNum[cnt2]), transColor[cnt2]));
			}
		}
	}

	/**
	 * ???????????¶???????????????
	 *
	 * @return result ??????????????????????????????
	 * @param count
	 *            ????????¨??????"0"?????°???0????????\?????????????????£?????¨????????°?????°??????
	 */
	private static int utRummy(ArrayList<UTRummyCard> cardArr) {

		// ?????????0???????????????
		int result = ADDRESSPLUSZERO;

		// ???????????????????????´???
		Collections.sort(cardArr, new Comparator<UTRummyCard>() {
			@Override
			public int compare(UTRummyCard numA, UTRummyCard numB) {
				// ???????????°????????????????????´???????\?????????????????????????
				return numA.getFrontnumber() - numB.getFrontnumber();
			}
		});

		// 3??£?¶????????????????????????°?¶????
		serialCard(cardArr);

		// ??????????????????3???????????°?¶????
		sameCard(cardArr);

		return  result = verificationCard(result, cardArr);

	}// utRummy????????????????????????

	private static int verificationCard(int result, ArrayList<UTRummyCard> cardArr) {
		// ???????????????0???????????????
		int count = ADDRESSPLUSZERO;

		/**
		 * @Warnning ???????????????????????´??????
		 *
		 *           ???????????????????????\????????????????????¶????????????????????¨??§
		 */
		for (int cnt = ADDRESSPLUSZERO; cnt < cardArr.size(); cnt++) {

			/**
			 * ????????? ?????¶????????????????????????????????§???????????????ZERO????????\?????????????????????
			 */
			if (cardArr.get(cnt).getRearColor() == ZERO) {

				// ?????\?????????????????????????????°?????°??????
				count++;

				// ?????????????????°??????????¶????????????¨???????????????????????????
				if (count == TRIPLESET) {
					// ?????¶??????????????°???????????????
					result = ADDRESSPLUSONE;
				}
			}
		}
		// ????????????????????????????????????
		return result;
	}

	/**
	 * ????????°????????????????????°?¶????
	 *
	 * @param cardArr
	 *            ?????¶??????????????°"0"????????\????????????????????????
	 */
	private static void sameCard(ArrayList<UTRummyCard> cardArr) {
		/**
		 * for??????????????¬???
		 *
		 * ???????????????????±????????????¶ ??????1 2 3 3 4 5 7 7 7 ??? [7] [7] [7]
		 *
		 * @param cnt1
		 *            ???????????????????????? "0";
		 * @param cnt2
		 *            ???????????????????????? "cnt1 + 1";
		 * @param cnt3
		 *            ???????????????????????? "cnt2 + 1";
		 *
		 */
		// for???????????????????????????????????????????????¨???????????????????????????????????????????????????
		for (int cnt1 = ADDRESSPLUSZERO; cnt1 < cardArr.size() - ADDRESSPLUSTWO; cnt1++) {
			for (int cnt2 = cnt1 + ADDRESSPLUSONE; cnt2 < cardArr.size() - ADDRESSPLUSONE; cnt2++) {
				for (int cnt3 = cnt2 + ADDRESSPLUSONE; cnt3 < cardArr.size(); cnt3++) {

					// (1)?????????????????????????????????
					if (cardArr.get(cnt1).getRearColor().equals(cardArr.get(cnt2).getRearColor())
							&& cardArr.get(cnt2).getRearColor().equals(cardArr.get(cnt3).getRearColor())) {

						// (2)????????°???????????????????????????
						if (cardArr.get(cnt1).getFrontnumber() == cardArr.get(cnt2).getFrontnumber()
								&& cardArr.get(cnt2).getFrontnumber() == cardArr.get(cnt3).getFrontnumber()) {

							// (3)???????????§??????????????????????????£??????????????§??????????????????
							if (!(cardArr.get(cnt1).getRearColor()).contains(ZERO)
									&& !(cardArr.get(cnt2).getRearColor()).contains(ZERO)
									&& !(cardArr.get(cnt3).getRearColor()).contains(ZERO)) {

								// ??¨???????????¶??????????????°??????????????????????????????"0"????????\
								cardArr.remove(cnt1);
								cardArr.add(cnt1, (new UTRummyCard(ZERO)));
								cardArr.remove(cnt2);
								cardArr.add(cnt2, (new UTRummyCard(ZERO)));
								cardArr.remove(cnt3);
								cardArr.add(cnt3, (new UTRummyCard(ZERO)));
							}
						}
					}
				}
			}
		}
	}// sameCard????????????????????????

	/**
	 * 3??£?¶??????°??????????????°?¶????
	 *
	 * @param cardArr
	 *            ?????¶??????????????°"0"????????\????????????????????????
	 */
	private static void serialCard(ArrayList<UTRummyCard> cardArr) {

		/**
		 * for??????????????¬???
		 *
		 * ???????????????????±????????????¶ ??????1 2 3 3 4 5 7 7 7 ??? [1] [2] [3]
		 *
		 * @param cnt1
		 *            ???????????????????????? "0";
		 * @param cnt2
		 *            ???????????????????????? "cnt1 + 1";
		 * @param cnt3
		 *            ???????????????????????? "cnt2 + 1";
		 *
		 */
		// for???????????????????????????????????????????????¨???????????????????????????????????????????????????
		for (int cnt1 = ADDRESSPLUSZERO; cnt1 < cardArr.size() - ADDRESSPLUSTWO; cnt1++) {
			for (int cnt2 = cnt1 + ADDRESSPLUSONE; cnt2 < cardArr.size() - ADDRESSPLUSONE; cnt2++) {
				for (int cnt3 = cnt2 + ADDRESSPLUSONE; cnt3 < cardArr.size(); cnt3++) {

					// (1)?????????????????????????????????
					if (cardArr.get(cnt1).getRearColor().equals(cardArr.get(cnt2).getRearColor())
							&& cardArr.get(cnt2).getRearColor().equals(cardArr.get(cnt3).getRearColor())) {

						// (2)3??£?¶??????°????????????
						if (cardArr.get(cnt1).getFrontnumber() == cardArr.get(cnt2).getFrontnumber() - 1
								&& cardArr.get(cnt1).getFrontnumber() == cardArr.get(cnt3).getFrontnumber() - 2) {

							// (3)???????????§??????????????????????????£??????????????§??????????????????
							if (!(cardArr.get(cnt1).getRearColor()).equals(ZERO)
									&& !(cardArr.get(cnt2).getRearColor()).equals(ZERO)
									&& !(cardArr.get(cnt3).getRearColor()).equals(ZERO)) {

								// ??¨???????????¶??????????????°??????????????????????????????"0"????????\
								cardArr.remove(cnt1);
								cardArr.add(cnt1, (new UTRummyCard(ZERO)));
								cardArr.remove(cnt2);
								cardArr.add(cnt2, (new UTRummyCard(ZERO)));
								cardArr.remove(cnt3);
								cardArr.add(cnt3, (new UTRummyCard(ZERO)));
							}
						}
					}
				}
			}
		}
	}// serialCard????????????????????????
}// Rummy4?????????????????????

/**
 * ?????????Card
 *
 * ???????????????????????????????????°????????????(???????????????????????°??????????????¨????????????) ??? ????????????????????????????§????
 *
 * 1) ????????¨??????????????????????????????2?????\?????¨????????????????????????????????????
 *
 * 2) ??¨??§??????????????????????????????????????°????????????????????????
 *
 * 3) ????????????????????????????????????
 *
 * 4) ??????????????????????????????????????????????????????????????????????????????
 *
 * 5) ???????????????????????????????????????????????????????????????????????¢
 *
 * 6) ????????§??????????????¨?????????????????°??????????????????????????????????????????????????? ?????????????????????????????????????????????
 *
 * 7)????????????????????°????????????????????????????????¨??????????§£????????????
 *
 * 8) ??????????´???´???????????????????????£????????????????????????????????????????????????????????£??¨?¢??????????????????????
 *
 * @author ?????????????????§???
 *
 */
class UTRummyCard {

	/**
	 * int ??????????????°?????????~????????§?????°????????\??????????????°??¶?????????????????\????????±????????\???
	 */
	private int frontnumber = 0;

	/**
	 * String ?????????????????????????¨???????????????????????????\????????±????????\???
	 */
	private String rearColor = "";

	public UTRummyCard() {

	}

	/**
	 * ????????°?????????????????????????????´???,???????????¨?????¨ ???) ?????????????????¶??????????????°??¢???????????±????¶??????¨??????
	 *
	 * @param ZERO
	 *            ????????° ZERO
	 */
	public UTRummyCard(String ZERO) {
		rearColor = ZERO;
	}

	/**
	 * ????????????????????????????????????????????????????????°??¨??????int,String??????
	 *
	 * @param num
	 *            ???????????????????????????????????°???
	 * @param color
	 *            ????????????????????????????????????
	 */
	public UTRummyCard(int num, String color) {
		frontnumber = num;
		rearColor = color;
	}

	/**
	 * private????£?????????\????????????????????????????????????
	 *
	 * @return int?????§?????\?????¨?????????????????°??????????????????
	 */
	public int getFrontnumber() {
		return frontnumber;
	}

	/**
	 * private????£?????????\????????????????????????????????????
	 *
	 * @param frontnumber
	 *            int?????§?????\?????¨????????¬???????????????????????°??????????´?
	 */
	public void setFrontnumber(int frontnumber) {
		this.frontnumber = frontnumber;
	}

	/**
	 * private????£?????????\????????????????????????????????????
	 *
	 * @return String?????§?????\?????¨?????????????????????????????????
	 */
	public String getRearColor() {
		return rearColor;
	}

	/**
	 * private????£?????????\????????????????????????????????????
	 *
	 * @param rearColor
	 *            String?????§?????\?????¨?????????????????????????????????
	 */
	public void setRearColor(String rearColor) {
		this.rearColor = rearColor;
	}

}// UTRummyCard?????????????????????