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 C++ (judge verdict: Time Limit Exceeded)

#include<iostream>
#include<queue>
#include<string>
using namespace std;
string S; string Q[100000]; int L, R;
int main() {
	cin >> S; Q[0] = S; L = 0; R = 1; bool flag = false;
	while (L < R) {
		string T = Q[L]; L++;
		if (T == "ABC") { cout << "Yes" << endl; flag = true; break; }
		for (int i = 0; i < 3; i++) {
			string U = "";
			for (int j = 0; j < T.size(); j++) {
				if (j < S.size() - 2 && T.substr(j, 3) == "ABC") { U += (char)('A' + i); j += 2; }
				else { U += T[j]; }
			}
			if (T != U) { Q[R] = U; R++; }
		}
	}
	if (flag == false)cout << "No" << endl;
	return 0;
}