// Original C++ solution (slower):
#include <iostream>

#include <fstream>

#include <string> 

#include <cmath>  

#include <cstdlib>

#include <ctime>

#include <vector>

#include <algorithm>

#include <numeric>

#include <map>

#include <set>

#include <queue>

#include <deque>

#include <functional>



using namespace std;

using ll = long long;



#define FOR(i, m, n) for(int i = (m);i < (n);i++)

#define REP(i,n) for(int i = 0; i < int(n); i++)

#define VI vector<int>

#define VVI vector<vector<int>>

#define VVVI vector<vector<vector<int>>>

#define VL vector<ll>

#define VB vector<bool>

#define VVB vector<vector<bool>>

#define PAIR pair<int,int>

#define MP make_pair

#define VP vector<pair<int,int>>

#define VS vector<string>

#define QUE queue<int>

#define DEQ deque<int>

#define PQUE priority_queue<int> //5,5,4,3,3,2,...

#define REPQUE priority_queue<int, vector<int>, greater<int>> //1,1,2,3,4,4,5,...

#define SUM(obj) accumulate((obj).begin(), (obj).end(), 0)

#define SORT(obj) sort((obj).begin(), (obj).end()) // 1,2,3,4,5...

#define RESORT(obj) sort((obj).begin(), (obj).end(), greater<int>()) // 5,4,3,2,1...

#define UB(obj,n) upper_bound((obj).begin(), (obj).end(), n) //itr > n

#define LB(obj,n) lower_bound((obj).begin(), (obj).end(), n) //itr>= n



const ll MOD = (ll)1e9 + 7;

int dx[8000] = {}, dy[8000] = {};



int main() {

	string S;

	cin >> S;

	int x, y;

	cin >> x >> y;

	int N = S.size();

	

	int d = 0, nx = 1, ny = 0;

	REP(i, N) {

		if (S[i] == 'T') {

			d++;

			if (d % 2 == 0) nx++;

			if (d % 2 == 1) ny++;

		}

		if (S[i] == 'F') {

			if (d % 2 == 0) dx[nx - 1]++;

			if (d % 2 == 1) dy[ny - 1]++;

		}

	}



	if (ny == 0) ny = 1;



	VVB dpx(nx, VB(16000 + 1, false)), dpy(ny, VB(16000 + 1, false));

	dpx[0][dx[0] + 8000] = true;

	

	FOR(i, 1, nx) {

		REP(j, 16000 + 1) {

			if (j + dx[i] <= 16000) dpx[i][j] = dpx[i - 1][j + dx[i]];

			if (j - dx[i] >= 0) if (!dpx[i][j]) dpx[i][j] = dpx[i - 1][j - dx[i]];

		}

	}



	dpy[0][dy[0] + 8000] = dpy[0][-dy[0] + 8000] = true;

	FOR(i, 1, ny) {

		REP(j, 16000 + 1) {

			if (j + dy[i] <= 16000) dpy[i][j] = dpy[i - 1][j + dy[i]];

			if (j - dy[i] >= 0) if(!dpy[i][j]) dpy[i][j] = dpy[i - 1][j - dy[i]];

		}

	}

	



	/*REP(i, 16000 + 1) if (dpx[nx - 1][i]) cout << i << " ";

	cout << endl;



	REP(i, 16000 + 1) if (dpx[ny - 1][i]) cout << i << " ";

	cout << endl;*/



	S = ((dpx[nx - 1][x + 8000])&&(dpy[ny - 1][y + 8000])) ? "Yes" : "No";

	cout << S << endl;;

	//cin >> S;



	return 0;

}


// Optimized solution to the same problem (faster):
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

using ull = unsigned long long;



#define REP(i,n) for(long long i = 0; i < (n); i++)

#define FOR(i, m, n) for(long long i = (m);i < (n); ++i)

#define ALL(obj) (obj).begin(),(obj).end()

#define SPEED cin.tie(0);ios::sync_with_stdio(false);



template<class T> using V = vector<T>;

template<class T, class U> using P = pair<T, U>;

template<class T> using PQ = priority_queue<T>;

template<class T> using PQR = priority_queue<T,vector<T>,greater<T>>;



constexpr long long MOD = (long long)1e9 + 7;

constexpr long long MOD2 = 998244353;

constexpr long long HIGHINF = (long long)1e18;

constexpr long long LOWINF = (long long)1e15;

constexpr long double PI = 3.1415926535897932384626433;



template <class T> vector<T> make_v(size_t N,T init){return vector<T>(N,init);}

template <class... T> auto make_v(size_t N,T... t){return vector<decltype(make_v(t...))>(N,make_v(t...));}

template <class T> void corner(bool flg, T hoge) {if (flg) {cout << hoge << endl; exit(0);}}

template <class T, class U>ostream &operator<<(ostream &o, const map<T, U>&obj) {o << "{"; for (auto &x : obj) o << " {" << x.first << " : " << x.second << "}" << ","; o << " }"; return o;}

template <class T>ostream &operator<<(ostream &o, const set<T>&obj) {o << "{"; for (auto itr = obj.begin(); itr != obj.end(); ++itr) o << (itr != obj.begin() ? ", " : "") << *itr; o << "}"; return o;}

template <class T>ostream &operator<<(ostream &o, const multiset<T>&obj) {o << "{"; for (auto itr = obj.begin(); itr != obj.end(); ++itr) o << (itr != obj.begin() ? ", " : "") << *itr; o << "}"; return o;}

template <class T>ostream &operator<<(ostream &o, const vector<T>&obj) {o << "{"; for (int i = 0; i < (int)obj.size(); ++i)o << (i > 0 ? ", " : "") << obj[i]; o << "}"; return o;}

template <class T, class U>ostream &operator<<(ostream &o, const pair<T, U>&obj) {o << "{" << obj.first << ", " << obj.second << "}"; return o;}

template <template <class tmp>  class T, class U> ostream &operator<<(ostream &o, const T<U> &obj) {o << "{"; for (auto itr = obj.begin(); itr != obj.end(); ++itr)o << (itr != obj.begin() ? ", " : "") << *itr; o << "}"; return o;}

void print(void) {cout << endl;}

template <class Head> void print(Head&& head) {cout << head;print();}

template <class Head, class... Tail> void print(Head&& head, Tail&&... tail) {cout << head << " ";print(forward<Tail>(tail)...);}

template <class T> void chmax(T& a, const T b){a=max(a,b);}

template <class T> void chmin(T& a, const T b){a=min(a,b);}

void YN(bool flg) {cout << (flg ? "YES" : "NO") << endl;}

void Yn(bool flg) {cout << (flg ? "Yes" : "No") << endl;}

void yn(bool flg) {cout << (flg ? "yes" : "no") << endl;}



vector<pair<char,long long>> Rarts(string S){

	S = S + ".";

	int cnt = 1;

	vector<pair<char,long long>> res;

 	for(int i = 0; i+1 < S.size(); ++i){

		 if(S[i]==S[i+1]) {

			 cnt++;

		 }

		 else{

			 res.push_back({S[i],cnt});

			 cnt = 1;

		 }

	}

	return res;

}



//verify https://atcoder.jp/contests/agc039/tasks/agc039_a



int main() {

    string S; cin >> S;

    int x,y; cin >> x >> y;

    auto R = Rarts(S);



    vector<int> dx,dy;

    int prt = 0;

    for(auto p: R) {

        if(p.first=='T') (prt += p.second) %= 2;

        else {

            if(prt%2){

                dy.push_back(p.second);

            }

            else {

                dx.push_back(p.second);

            }

        }

    }

    bitset<20000> bsx,bsy;

    bsx.set(10000);

    bsy.set(10000);



    int flg = (S[0]=='F');

    if(flg && dx.size()) {

        bsx<<=dx[0];

    }

    for(int i = flg; i < dx.size(); ++i) {

        auto l = (bsx<<dx[i]);

        auto r = (bsx>>dx[i]);

        bsx = l|r;

    }

    for(int i = 0; i < dy.size(); ++i) {

        auto l = (bsy<<dy[i]);

        auto r = (bsy>>dy[i]);

        bsy = l|r;

    }

    Yn(bsx[x+10000]&&bsy[y+10000]);





    return 0;

}


// Fastest known solution for this problem: