//============================================================================
// Name        : FiftyFifty.cpp
// Author      :
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <cstring>
using namespace std;

#define MAX_SIZE 4
//#define DEBUG

/* 状態 */
enum status {
	eSTATE_NO0,		/*	初期状態(入力なし)			*/
	eSTATE_NO1,		/*	入力:A						*/
	eSTATE_NO2,		/*  入力がAA					*/
	eSTATE_NO3,		/*	入力がAB					*/
	eSTATE_NO4,		/*	入力がABA					*/
	eSTATE_NO5,		/*	入力がABB					*/
	eSTATE_NO6,		/*	Noを出力(AABBが揃わない状態)*/
	eSTATE_NO7,		/*	Yesを出力(AABBが揃った状態)	*/
	eSTATE_NO8		/*	終了状態					*/
};

#define DEBUG_OFF 0
#define DEBUG_ON 1

void vCurrentStatus(int iDebugMode,enum status eCurrentStatus);

int main() {

	char cInputText[MAX_SIZE];				/*	入力配列	*/
	char cSampleChar[3];					/*	標本配列	*/

	enum status eCurrentState = eSTATE_NO0;	/*	状態	*/
//	int iInputLen = 0;						/*	文字数		*/
	int iLoopCnt;						/*	ループ用カウンタ	*/
	int iCmpResult = 0;						/*	比較結果	*/
	int iDebugMode = DEBUG_OFF;


	/* 入力処理 */
#ifdef DEBUG
//	cout << "input:";
#endif
	cin >> cInputText;

#ifdef DEBUG
	iDebugMode = DEBUG_ON;
	int size = sizeof(cInputText);
	cout << "INPUT:" << size << ":"<< cInputText << endl;
	cout << "Input_addr:" << &cInputText << endl;
	cout << "sample_addr:" << &cSampleChar << endl;
#endif

	/* 初期化処理 */
	memset(cSampleChar,0,sizeof(cSampleChar));
	iLoopCnt = -1;

	while(1){
		iLoopCnt++; /* n番目の文字を示す。 */

		/* 最大文字以上だったら終了 */
		if (iLoopCnt > MAX_SIZE+1){
			break;
		}

//		cout << "iLoopCnt:" << iLoopCnt << endl;
		vCurrentStatus(iDebugMode,eCurrentState);
		switch( eCurrentState ) {
			case eSTATE_NO0:
				/* 一文字目を標本1文字目として登録 */
				std::memcpy(&cSampleChar[0],&cInputText[0],1);

				eCurrentState = eSTATE_NO1;	/* 状態遷移 */
				break;

			case eSTATE_NO1:

				/* 2文字目を標本1文字目と比較 */
				iCmpResult = std::strncmp(&cSampleChar[0],&cInputText[iLoopCnt],1);
#ifdef DEBUG
				cout << "  CmpResult:" << iCmpResult << endl;
				cout << "larg:" << &cSampleChar[0] << "//rarg :" << &cInputText[iLoopCnt] << endl;
#endif


				if( iCmpResult == 0 ){
					/* 標本1文字目と一致 */

					eCurrentState = eSTATE_NO2;	/* 状態遷移 */

				} else {
					/* 標本1文字目と不一致 */

					/* 2文字目を標本2文字目として登録 */
					std::memcpy(&cSampleChar[1],&cInputText[iLoopCnt],1);

					eCurrentState = eSTATE_NO3;	/* 状態遷移 */

				}
				break;

			case eSTATE_NO2:
				/* 3文字目を標本1文字目と比較 */
				iCmpResult = std::strncmp(&cSampleChar[0],&cInputText[iLoopCnt],1);
#ifdef DEBUG
				cout << "  CmpResult:" << iCmpResult << endl;
#endif


				if( iCmpResult == 0 ){
					/* 3文字目が標本1文字目と一致 */

					eCurrentState = eSTATE_NO6;	/* 状態遷移 */

				} else {
					/* 標本1文字目と不一致 */

					/* 3文字目を標本2文字目として登録 */
					std::memcpy(&cSampleChar[1],&cInputText[iLoopCnt],1);

					eCurrentState = eSTATE_NO4;	/* 状態遷移 */

				}

				break;

			case eSTATE_NO3:
				/* 3文字目を標本1文字目と比較 */
				iCmpResult = std::strncmp(&cSampleChar[0],&cInputText[iLoopCnt],1);
#ifdef DEBUG
				cout << "  #1:qqCmpResult:" << iCmpResult << endl;
				cout << "larg:" << &cSampleChar[1] << "//rarg :" << &cInputText[iLoopCnt] << endl;
#endif


				if( iCmpResult == 0 ){
					/* 3文字目が標本1文字目と一致 */

					eCurrentState = eSTATE_NO4;	/* 状態遷移 */

				} else {
					/* 3文字目が標本1文字目と不一致 */

					/* 3文字目を標本2文字目と比較 */
					iCmpResult = std::strncmp(&cSampleChar[1],&cInputText[iLoopCnt],1);
#ifdef DEBUG
					cout << "  #2:CmpResult:" << iCmpResult << endl;
					cout << "larg:" << &cSampleChar[1] << "//rarg :" << &cInputText[iLoopCnt] << endl;

#endif
					if( iCmpResult == 0 ){
						/* 3文字目が標本2文字目と一致 */

						eCurrentState = eSTATE_NO5;	/* 状態遷移 */

					} else {
						/* 3文字目が標本2文字目と不一致 */

						eCurrentState = eSTATE_NO6;	/* 状態遷移 */
					}
				}

				break;

			case eSTATE_NO4:
				/* 4文字目を標本1文字目と比較 */
				iCmpResult = std::strncmp(&cSampleChar[0],&cInputText[iLoopCnt],1);
#ifdef DEBUG
				cout << "  CmpResult:" << iCmpResult << endl;
#endif


				if( iCmpResult == 0 ){
					/* 4文字目が標本1文字目と一致 */

					eCurrentState = eSTATE_NO6;	/* 状態遷移 */

				} else {
					/* 4文字目が標本1文字目と不一致 */

					/* 4文字目を標本2文字目と比較 */
					iCmpResult = std::strncmp(&cSampleChar[1],&cInputText[iLoopCnt],1);

					if( iCmpResult == 0 ){
						/* 4文字目が標本2文字目と一致 */

						eCurrentState = eSTATE_NO7;	/* 状態遷移 */

					} else {
						/* 4文字目が標本2文字目と不一致 */

						eCurrentState = eSTATE_NO6;	/* 状態遷移 */
					}
				}

				break;

			case eSTATE_NO5:
				/* 4文字目を標本1文字目と比較 */
				iCmpResult = std::strncmp(&cSampleChar[0],&cInputText[iLoopCnt],1);
#ifdef DEBUG
				cout << "  CmpResult:" << iCmpResult << endl;
#endif


				if( iCmpResult == 0 ){
					/* 4文字目が標本1文字目と一致 */

					eCurrentState = eSTATE_NO7;	/* 状態遷移 */

				} else {
					/* 4文字目が標本1文字目と不一致 */

					/* 4文字目を標本2文字目と比較 */
					iCmpResult = std::strncmp(&cSampleChar[1],&cInputText[iLoopCnt],1);

					if( iCmpResult == 0 ){
						/* 4文字目が標本2文字目と一致 */

						eCurrentState = eSTATE_NO6;	/* 状態遷移 */

					} else {
						/* 4文字目が標本2文字目と不一致 */

						eCurrentState = eSTATE_NO6;	/* 状態遷移 */
					}
				}
				break;

			case eSTATE_NO6:
				cout << "No";
				eCurrentState = eSTATE_NO8;	/* 状態遷移 */
				break;

			case eSTATE_NO7:
				cout << "Yes";
				eCurrentState = eSTATE_NO8;	/* 状態遷移 */
				break;

			default:
				cout << "status error";
				eCurrentState = eSTATE_NO8;	/* 状態遷移 */
				break;
		}

		if ( eCurrentState == eSTATE_NO0 || eCurrentState == eSTATE_NO8 ) {
//			cout << endl << "loop out" << endl;
			break;
		}
	}

	return 0;
}


void vCurrentStatus(int iDebugMode,enum status eCurrentStatus){
	if(iDebugMode == DEBUG_ON){
		cout << "-> CurrentStatus:" << eCurrentStatus << endl;

	} else {
		/* 処理なし */
	}
};



Measured memory_bytes: 256