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++11 (judge verdict: Wrong Answer)

#include<bits/stdc++.h>
#define range(i,a,b) for(int i = (a); i < (b); i++)
#define rep(i,b) for(int i = 0; i < (b); i++)
#define all(a) (a).begin(), (a).end()
#define show(x)  cerr << #x << " = " << (x) << endl;
using namespace std;

bool f = false;

void dfs(string s){
    if(s.size() < 3) return;
    if(s == "ABC") f = true;
    if(f) return;

    vector<int> it;
    rep(i,s.size() - 3){
        if(s.substr(i,3) == "ABC"){
            it.emplace_back(i);
        }
    }
    if(it.size() == 0) return;

    rep(i,it.size()) s.replace(it[i] - 2 * i, 3, "A");
    dfs(s);
    rep(i,it.size()) s[it[i] - 2 * i] = 'B';
    dfs(s);
    rep(i,it.size()) s[it[i] - 2 * i] = 'C';
    dfs(s);
}

int main(){
    string s;
    cin >> s;
    dfs(s);
    if(f) cout << "Yes" << endl;
    else cout << "No" << endl;
}