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: Wrong Answer)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;

import static java.lang.Integer.parseInt;

/**
 * ABC Gene
 */
public class Main {

	static final String TARGET = "ABC";
	static final String[] REP = {"A", "B", "C"};

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line;
		String[] words;

		Deque<String> queue = new ArrayDeque<>();

		queue.offer(br.readLine());
		boolean ans = false;

		while (!queue.isEmpty()) {

			String s = queue.poll();

			System.out.println(s);

			if (s.equals(TARGET)) {
				ans = true;
				break;
			}

			for (String r : REP) {
				String _s = s.replace(TARGET, r);
				if (!_s.equals(s)) {
					queue.offer(_s);
				}
			}
		}

		System.out.println(ans ? "Yes" : "No");

	} //end main

	static String replace(String s, char r) {
		char[] ss = s.toCharArray();
		int count = 0;
		for (int i = 1; i < ss.length - 1; i++) {
			if (ss[i - 1] == 'A' && ss[i] == 'B' && ss[i + 1] == 'C') {
				ss[i] = r;
				ss[i - 1] = '_';
				ss[i + 1] = '_';
				count++;
			}
		}
		if (count == 0) {
			return s;
		}
		char[] _ss = new char[ss.length - count * 2];
		for (int i = 0, j = 0; i < ss.length; i++) {
			if (ss[i] != '_') {
				_ss[j] = ss[i];
				j++;
			}
		}
		return String.valueOf(_ss);
	}

}