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

/*
  AOJ 2708
  Title:ABC gene
  @kankichi573
*/
#include <stdio.h>
#include <string.h>


// replace all ABC to *
void findABC(char *in,char *out,char moji[3])
{
  char *p,*q;


  for(p=in,q=out;*p;)
    if(0==strncmp("ABC",p,3))
      {
	*q='*';q++;
	p+=3;
      }
    else
      {
	moji[*p-'A']++;
	*q++=*p++;
      }
    *q='\0';
}
void char_replace(char *s,char from,char to)
{
  char *p;
  for(p=s;*p;p++)
    if(*p == from)
      *p = to;

}

int main()
{
  char buf[5001],output[5001],moji[3];
  int ret,i,no_use;

  scanf("%s",buf);

  while(1)
    {
      if(0==strcmp("ABC",buf))
	{
	  ret=1;
	  //printf("SUCCES\n");
	  break;
	}
      if(strlen(buf) <= 4)
	{
	  ret=0;
	  //printf("FAIL 1\n");
	  break;
	}
      memset(moji,0,sizeof(moji));
      findABC(buf,output,moji);

      //printf("%s\n",output);

      if(2 != (moji[0]?1:0)+(moji[1]?1:0)+(moji[2]?1:0))
	{
	  ret=0;
	  //printf("FAIL 1\n");
	  break;
	}

      for(i=0,no_use=-1;i<3;i++)
	if(moji[i]==0)
	  {
	    no_use = i;
	    break;
	  }

      char_replace(output,'*','A'+no_use);

      //printf("%c",'A'+no_use);
      //printf("%s\n",output);
      strcpy(buf,output);
     
  //printf("%d",ret);
  }
  printf("%s\n",ret?"Yes":"No");


  return(0);
}