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: Accepted)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ll long long
#define rep(i,l,r)for(ll i=(l);i<(r);i++)

char s[5010];
int main(){
	scanf("%s",s);
	if(strlen(s)<3){
		puts("No");
		return 0;
	}
	while(s[1]){
		char temp[5010]={};
		int cnt=0;
		int n=strlen(s);
		int flag=0;
		int check=0;
		rep(i,0,n){
			if(s[i]=='A'&&s[i+1]=='B'&&s[i+2]=='C'){
				temp[cnt++]='X';
				i+=2;
				check=1;
			}else{
				temp[cnt++]=s[i];
				flag|=1<<(s[i]-'A');
			}
		}
		if(cnt==1){
			puts("Yes");
			return 0;
		}else if((check&&(flag==3||flag==5||flag==6))){
			rep(i,0,cnt)if(temp[i]=='X')temp[i]=flag==3?'C':flag==5?'B':'A';
			memcpy(s,temp,5000);
		}else{
			puts("No");
			return 0;
		}
	}
}