Problem:
ABC Gene

文字列 ABC で表される遺伝子配列がある。あなたは次の操作を何回か行い、この遺伝子配列を書き換えていくことができる。

文字 A，B，C のうち 1 つを選ぶ。これを x とおく。遺伝子配列に含まれるすべての x をそれぞれ ABC へ同時に置き換える。

A，B，C だけからなる文字列 S が与えられる。遺伝子配列を S に一致させられるか判定せよ。

Constraints

1 ≤ |S| ≤ 5,000

S は A，B，C だけからなる。

Input Format

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

S

Output Format

遺伝子配列を S に一致させられるならば Yes を、一致させられないならば No を一行に出力せよ。

Sample Input 1

ABC

Sample Output 1

Yes

遺伝子配列ははじめから ABC である。

Sample Input 2

AABCC

Sample Output 2

Yes

B を選んで操作を行うと ABC → AABCC となる。

Sample Input 3

AABCABC

Sample Output 3

No

例えば、C を選んで操作を行っても AABCC → AABCABC とはならない。すべての C をそれぞれ ABC へ同時に置き換えるので、実際は AABCC → AABABCABC となる。

Solution in JAVA (judge verdict: Runtime Error)

import java.util.*;

public class Main {
	static String[] ABC = { "A", "B", "C" };

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String S = sc.next();
		if (dfs(S)) {
			System.out.println("Yes");
		} else {
			System.out.println("No");
		}
	}

	static boolean dfs(String S) {
		if (S.equals("ABC")) {
			return true;
		}
		int cnt = 0;
		boolean f = false;
		boolean[] pos = new boolean[S.length()];
		for (int j = 0; j + 3 <= S.length(); ++j) {
			if (S.substring(j, j + 3).equals("ABC")) {
				pos[j] = true;
				++cnt;
			}
		}
		if (cnt < 1)
			return false;
		out: for (int i = 0; i < 3; ++i) {
			for (int j = 0; j < S.length(); ++j) {
				if (S.charAt(j) == 'A' + i) {
					if (!pos[j - i])
						continue out;
				}
			}
			String next = S.replaceAll("ABC", ABC[i]);
			f |= dfs(next.toString());
		}
		return f;
	}

	static void tr(Object... objects) {
		System.out.println(Arrays.deepToString(objects));
	}
}