#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

// 内部定数
#define D_ON			1										// 汎用フラグ - ON
#define D_OFF			0										// 汎用フラグ - OFF
#define D_STR_MAX		8000									// 最大文字列長

// 内部変数
static int si1X[D_STR_MAX / 2];									// 左右移動
static int siXCnt;												// 左右移動数
static int si1Y[D_STR_MAX / 2];									// 上下移動
static int siYCnt;												// 上下移動数
static int si2Move[D_STR_MAX / 2][D_STR_MAX * 2 + 5];			// 移動済みフラグ

// 内部変数 - テスト用
#ifdef D_TEST
	static int siRes;
	static FILE *szpFpT, *szpFpA;
#endif

// ソート関数 - int昇順
int
fSortFnc(
	const void *pzpVal1			// <I> 値１
	, const void *pzpVal2		// <I> 値２
)
{
	int *lipVal1 = (int *)pzpVal1;
	int *lipVal2 = (int *)pzpVal2;

	// 昇順
	if (*lipVal1 >  *lipVal2) {
		return(1);
	}
	else if (*lipVal1 < *lipVal2) {
		return(-1);
	}

	return 0;
}

// 移動可能チェック - メイン
int
fChkMoveMain(
	int piPNow					// <I> 現在位置
	, int piPEnd				// <I> 目標位置
	, int *pipMove				// <I> 移動データ
	, int piMNow				// <I> 現在移動数 0～
	, int piMCnt				// <I> 移動データ数
)
{
	int liRet;

	// 移動済みフラグ
	if (si2Move[piMNow][piPNow + D_STR_MAX] != D_OFF) {
		return -1;
	}
	si2Move[piMNow][piPNow + D_STR_MAX] = D_ON;

	// 終了チェック
	if (piMNow == piMCnt) {				// 移動終了

		// 目標位置チェック
		if (piPNow == piPEnd) {
			return 0;
		}
		else {
			return -1;
		}
	}

	// ＋移動
	liRet = fChkMoveMain(piPNow + pipMove[piMNow], piPEnd, pipMove, piMNow + 1, piMCnt);
	if (liRet == 0) {
		return 0;
	}

	// －移動
	liRet = fChkMoveMain(piPNow - pipMove[piMNow], piPEnd, pipMove, piMNow + 1, piMCnt);
	if (liRet == 0) {
		return 0;
	}

	return -1;
}

// 移動可能チェック
int
fChkMove(
	int piPNow					// <I> 現在位置
	, int piPEnd				// <I> 目標位置
	, int *pipMove				// <I> 移動データ
	, int piMCnt				// <I> 移動データ数
)
{
	// ソート
	qsort(pipMove, piMCnt, sizeof(int), fSortFnc);

	// 移動済みフラグ初期化
	memset(si2Move, D_OFF, sizeof(si2Move));

	// チェックメイン
	return fChkMoveMain(piPNow, piPEnd, pipMove, 0, piMCnt);
}

// 実行メイン
int
fMain(
	int piTNo					// <I> テスト番号 1～
)
{
	int liRet;
	char lc1Buf[1024], lc1Out[1024];

	// データ初期化
	siXCnt = 0;													// 左右移動数
	siYCnt = 0;													// 上下移動数

	// テストファイルオープン
#ifdef D_TEST
	sprintf(lc1Buf, ".\\Test\\T%d.txt", piTNo);
	szpFpT = fopen(lc1Buf, "r");
	sprintf(lc1Buf, ".\\Test\\A%d.txt", piTNo);
	szpFpA = fopen(lc1Buf, "r");
	siRes = 0;
#endif

	// 命令文取得
	char lc1Ope[D_STR_MAX + 5];
#ifdef D_TEST
	fgets(lc1Ope, sizeof(lc1Ope), szpFpT);
#else
	fgets(lc1Ope, sizeof(lc1Ope), stdin);
#endif

	// 初期位置
	int liFx = 0;
	int liNo;
	for (liNo = 0; lc1Ope[liNo] == 'F'; liNo++) {
		liFx++;
	}

	// 移動数セット
	int liLen = 0;
	int liTCnt = 1;												// 左右方向
	for ( ; ; liNo++) {
		if (lc1Ope[liNo] == 'F') {									// 移動
			liLen++;
			if (lc1Ope[liNo + 1] != 'F') {								// 次が移動以外
				liTCnt %= 2;
				if (liTCnt == 1) {											// 左右方向
					si1X[siXCnt] = liLen;
					siXCnt++;
				}
				else {														// 上下方向
					si1Y[siYCnt] = liLen;
					siYCnt++;
				}
				liLen = 0;
			}
		}
		else if (lc1Ope[liNo] == 'T') {								// 方向
			liTCnt++;
		}
		else {														// 終了
			break;
		}
	}

	// 目標位置取得
	int liTx, liTy;
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpT);
#else
	fgets(lc1Buf, sizeof(lc1Buf), stdin);
#endif
	sscanf(lc1Buf, "%d%d", &liTx, &liTy);

	// 移動可能チェック
	liRet = fChkMove(liFx, liTx, si1X, siXCnt);					// 左右方向
	if (liRet == 0) {
		liRet = fChkMove(0, liTy, si1Y, siYCnt);					// 上下方向
	}

	// 結果セット
	if (liRet == 0) {
		sprintf(lc1Out, "Yes\n");
	}
	else {
		sprintf(lc1Out, "No\n");
	}

	// 結果表示
#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
	if (strcmp(lc1Buf, lc1Out)) {
		siRes = -1;
	}
#else
	printf("%s", lc1Out);
#endif

	// テストファイルクローズ
#ifdef D_TEST
	fclose(szpFpT);
	fclose(szpFpA);
#endif

	// テスト結果
#ifdef D_TEST
	if (siRes == 0) {
		printf("OK %d\n", piTNo);
	}
	else {
		printf("NG %d\n", piTNo);
	}
#endif

	return 0;
}

int
main()
{

#ifdef D_TEST
	int i;
	for (i = D_TEST_SNO; i <= D_TEST_ENO; i++) {
		fMain(i);
	}
#else
	fMain(0);
#endif

	return 0;
}



Measured memory_bytes: 250492