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;

public class Main{

	/**
	 * ?????????????????????????????\???????¢??????°???
	 * ??????
	 * 1) ????´???????????????? ??????String + String ??? Red 1 [1R] White 2 [2W] Gold 3 [3G]
	 * 2) if??§????´¢????????????.contains() ??? switch??? ??? return;
	 *
	 * ??????????????§BufferedReader?????????
	 *
	 * @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());
		// for????????? set????????°?????????
		for (int cnt = 0; cnt < set; cnt++) {
			// CardRummy????????? ???????????°??????????????????????????????????????????????????°???
			Rummy ru = new Rummy(br.readLine(), br.readLine());
			// ???????????¶??????????????°??? ????????????????????°0
			// result????????????????????????????´???´???
			int result = ru.playtheGame();
			// ?????????????´?
			answer.add(result);
		}

		// for????????? ??????????????????????????????
		for (int cnt = 0; cnt < answer.size(); cnt++)
			// ???????????????
			System.out.println(answer.get(cnt));

	}// ????????????????????????????????????

	/**
	 * ?????????CardRummy
	 */
	public static class Rummy {
		/**
		 * ?????????????????°??¶???
		 */
		private static final int ONECARDSET = 9;
		/**
		 * ?????????????????£?????????????????????
		 */
		private static final int CASTAREA = 2;
		/**
		 * ?????????????????£?????????????????°??????????´???´???
		 */
		private static final int CASTADDRESS =0;

		/**
		 * ????????????????´???´???
		 */
		ArrayList<String> card = new ArrayList<String>();

		/**
		 * ?????°??????????????? ?????£???????????????????´???????
		 *
		 * @param tmpNum
		 *            ??????????????°???????????? ??????1 2 3 3 4 5 7 7 7
		 * @param transColor
		 *            ???????????????????????? ??????R R R R R R G G G
		 */
		public Rummy(String tmpNum, String tmpColor) {// ???????????°????????????
			// ?????°???????§£ ??°??????????´?
			String[] transNum = tmpNum.split(" ");
			// ?????°???????§£ ??????????´?
			String[] transColor = tmpColor.split(" ");
			// ?????¨??°??????????????????????´?????????´???
			String tmpCard = "";

			// for????????? ????§£??????????????????????????????
			for (int cnt = 0; cnt < ONECARDSET; cnt++) {
				/**
				 * ONECARDSET CardR??¨CardG??¨CardB???????????????9????????????
				 */
				// ????§£??????????????¨??°??????????????????
				tmpCard = transNum[cnt] + transColor[cnt];
				// ????´?
				card.add(tmpCard);
			}
		}// ?????????????????????????????????

		/**
		 * ???????????¶???????????????
		 *
		 * @return result ??????????????????????????????
		 *
		 * @param tmpArr ???????????´??????????????¨???????????´???
		 *
		 */
		public int playtheGame() {// ???????????°????????????

			// ?????????0???????????????
			int result = 0;
			// ???????????????????????´???

			//??¨???????????´???
			ArrayList<String> tmpArr = new ArrayList<String>();

			// ???????????????????????´???
			Collections.sort(card);
			//??´???????????????
//			tmpArr.addAll(card);
//			card.clear();
//			card.addAll(tmpArr);

			// 3??£?¶????????????????????????°?¶????
			serialNumCard(card); //?????£????????????

			// ??????????????????3???????????°?¶????
			sameNumCard(card); //?????£????????????

			// ???????????????????????´???
			Collections.sort(card);
			//??´???????????????
//			tmpArr.addAll(card);
//			card.clear();
//			card.addAll(tmpArr);

			// ????????????????????°??????0????????¨??¨0
			if (card.get(ONECARDSET - 1).contains("0")){
				// ?????¶??????????????°???????????????s
				result = 1;}
			// ????????????????????????????????????
			return result;
		}// playtheGame????????????????????????
		/**
		 * 3??£?¶??????°??????????????°?¶????
		 *
		 * @param card2
		 *            ?????¶??????????????°"0"????????\??????????????????
		 *
		 * @return "0"????????\???????????£????????????
		 */

		public ArrayList<String> serialNumCard(ArrayList<String> card) {// ?????£????????????

			/**
			 * for??????????????¬???
			 *
			 * ???????????????????±????????????¶ ??????1 2 3 3 4 5 7 7 7 ??? [1] [2] [3]
			 *
			 * @param cnt1
			 *            ???????????????????????? "0";
			 * @param cnt2
			 *            ???????????????????????? "cnt1 + 1";
			 * @param cnt3
			 *            ???????????????????????? "cnt2 + 1";
			 *
			 * @param tempNum String????????????????????°??????int??¢????????£???????????????????????¨????????°
			 *
			 * @param tempArr[] ??¨????????°?????????????????°??????????´? ??????????????°?????????????????????
			 *
			 * @param ONECARDSET
			 *            ??????????????????????¶????????????¨?????§?????????
			 */


			//??????????????°???????????¢??¨
			String tempNum1[] = new String[CASTAREA];
			String tempNum2[] = new String[CASTAREA];
			String tempNum3[] = new String[CASTAREA];

			// for????????????????????????????????????????????¨???????????????????????°????????????
			for (int cnt1 = 0; cnt1 < ONECARDSET - 2; cnt1++) {
				for (int cnt2 = cnt1 + 1; cnt2 < ONECARDSET - 1; cnt2++) {
					for (int cnt3 = cnt2 + 1; cnt3 < ONECARDSET; cnt3++) {

						/**
						 * ?????£????????????
						 *
						 * ?????????1???String???????????????????\???????
						 * ?????????2?????????????????¢?????????????????????
						 *
						 * ?????????1 ?????????
						 * 1) ??¨????????°??§??°???????????¢????´? ??? ???????¨?????????????????????????????????°???????????????????????§???????????????????????????
						 *    (??¢?????????????????????)
						 * 2) ??¨????????°??§??°???????????¢????´? ??? ??¨???int[]????????£??????????????°????????????????????????????????????????????????
						 *
						 * ?????????2 ?????????
						 * ???????????°??¢????????§????????????????????£
						 *
						 */

						//
						tempNum1 = card.get(cnt1).split("");
						tempNum2 = card.get(cnt2).split("");
						tempNum3 = card.get(cnt3).split("");
						// (1)3??£?¶?????????????????????????????????????
						if (Integer.parseInt(tempNum1[CASTADDRESS]) == Integer.parseInt(tempNum2[CASTADDRESS]) - 1
								&& Integer.parseInt(tempNum1[CASTADDRESS]) == Integer.parseInt(tempNum3[CASTADDRESS])
										- 2) {
							// (2)3??£?¶????????????????????????????????????????
							if (tempNum1[CASTADDRESS + 1].equals(tempNum2[CASTADDRESS + 1])
									&& tempNum2[CASTADDRESS + 1].equals(tempNum3[CASTADDRESS + 1])) {

								// (3)???????????????????????§?????????????????????
								if (!card.get(cnt1).contains("0") && !card.get(cnt2).contains("0")
										&& !card.get(cnt3).contains("0")) {

									// ??¨???????????¶??????????????°????????§?¨??????????"0"????????\
									card.remove(cnt1);
									card.add(cnt1, "0");
									card.remove(cnt2);
									card.add(cnt2, "0");
									card.remove(cnt3);
									card.add(cnt3, "0");
								}
						}
					}
				}
			}
			}
			// ?¶?????????¨???????????£???????????????????????????
			return card;
		}// serialNumCard ????????????????????????
		/**
		 * ????????°????????????????????°?¶????
		 *
		 * @param card
		 *            ?????¶??????????????°"0"????????\??????????????????
		 *
		 * @return "0"????????\???????????£????????????
		 */
		public ArrayList<String> sameNumCard(ArrayList<String> card) {// ???????????°????????????

			/**
			 * for??????????????¬???
			 *
			 * ???????????????????±????????????¶ ??????1 2 3 3 4 5 7 7 7 ??? [1] [2] [3]
			 *
			 * @param cnt1
			 *            ???????????????????????? "0";
			 * @param cnt2
			 *            ???????????????????????? "cnt1 + 1";
			 * @param cnt3
			 *            ???????????????????????? "cnt2 + 1";
			 *
			 * @param ONECARDSET
			 *            ??????????????????????¶????????????¨?????§?????????
			 */

			// for???????????????????????????????????????????????¨???????????????????????°????????????
			for (int cnt1 = 0; cnt1 < ONECARDSET - 2; cnt1++) {
				// ????????????????????¨???????????????????????°????????????
				for (int cnt2 = cnt1 + 1; cnt2 < ONECARDSET - 1; cnt2++) {
					for (int cnt3 = cnt2 + 1; cnt3 < ONECARDSET; cnt3++) {
						// (1)???????????????????????????????????????
						if (card.get(cnt1).equals(card.get(cnt2)) && card.get(cnt2).equals(card.get(cnt3))) {
							// (1)????????¶??????????????°??????????????????
							if (!card.get(cnt1).contains("0") && !card.get(cnt2).contains("0") && !card.get(cnt3).contains("0")){

								// ??¨???????????¶??????????????°????????§?¨??????????"0"????????\
								card.remove(cnt1);
								card.add(cnt1, "0");
								card.remove(cnt2);
								card.add(cnt2, "0");
								card.remove(cnt3);
								card.add(cnt3, "0");
							}
						}
					}
				}
			}
			// ?¶?????????¨???????????£???????????????????????????
			return card;
		}// sameNumCard????????????????????????

	}// Rummy?????????????????????

}// NRummy?????????????????????