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++14 (judge verdict: Accepted)

#include <bits/stdc++.h>

using namespace std;
char arr[3] = {'A', 'B', 'C'};

string conv(string s, int idx)
{
    string res = "";
    int i = 0;
    for (; i < (int)s.length() - 2; i++)
    {
        string sub = s.substr(i, 3);
        if (sub == "ABC")
        {
            res += arr[idx];
            i += 2;
        }
        else
            res += s[i];
    }
    res += s.substr(i);
    return res;
}

string reconv(string s, int idx)
{
    string res = "";
    for (int i = 0; i < (int)s.length(); i++)
    {
        if (s[i] == arr[idx])
            res += "ABC";
        else
            res += s[i];
    }
    return res;
}

int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);

    string s;
    cin >> s;
    if (s == "ABC")
    {
        cout << "Yes" << endl;
        return 0;
    }
    queue<string> que;
    que.push(s);
    while (!que.empty())
    {
        string now = que.front();
        que.pop();
        for (int i = 0; i < 3; i++)
        {
            string tmp = conv(now, i);
            if (tmp == now)
                break;
            if (now != reconv(tmp, i))
                continue;
            if (tmp == "ABC")
            {
                cout << "Yes" << endl;
                return 0;
            }
            que.push(tmp);
        }
    }
    cout << "No" << endl;
    return 0;
}