#include <bits/stdc++.h>
#define REP(i,n) for (int i = 0; i <(n); ++i)
#define REP2(i,x,n) for (int i = x; i <(n); ++i)
#define ALL(v) v.begin(), v.end()
#define RALL(v) v.rbegin(), v.rend()
using namespace std;
using ll = long long;
using P = pair<int,int>;
static const double PI = acos(-1);
static const int INF = 1e9+7;

/*
Tを区切り文字として考える
ｘ，y座標は独立して考える
DPで解ける
自分は，DPの書き方がわからなかった.
*2 ずつ遷移する場所が増えていくけど大丈夫なのかな...?
mapに変えたので，そんなに増えない


Tが連続しているとき
T % 2 == 1 : 軸の変換
T % 2 == 0: 軸そのまま
ただし， 初回にT=1のときは，Xの向きにしか進めない
*/

int main(){
  string s;
  cin >> s;
  int gx, gy;
  cin >> gx >> gy;
  // Xにすすめる区間，Yにすすめる区間を分ける．
  //はじめにTにがない場合を考える
  vector<int> mx;
  vector<int> my;
  bool flag = true;
  int cnt = 0;
  REP(i,s.size()){

    if(s[i] == 'F'){
      ++cnt;
      continue;
    }

    if(s[i] == 'T'){
      if(cnt != 0){
        if(flag) mx.push_back(cnt);
        else my.push_back(cnt);
        cnt = 0;
      }
      flag = !flag;
    }
  }
  if(cnt != 0){
    if(flag) mx.push_back(cnt);
    else my.push_back(cnt);
    cnt = 0;
  }

  // for(auto x : mx) cout << x << " ";
  // cout <<  endl;
  // for(auto x : my) cout << x << " ";
  // cout << endl;
  int xs = mx.size();
  int ys = my.size();




  vector<map<int, bool>> dpx(xs);
  vector<map<int, bool>> dpy(ys);

  //どちらかが初期値違う　初めにTがなければ，ｘの値は一意に決定する
  bool isx = false;
  bool isy = false;

  if(xs == 0) {
    if(gx == 0) isx = true;
    else {
      cout << "No" << endl;
      return 0;
    }
  }
  else{

    //残りの移動可能数を用意
    vector<int> xrem(xs+1);
    int remain = 0;
    for(int i = xs; i >= 0; --i){
      xrem[i] = remain;
      remain += mx[i];
    }



    if(s[0] == 'F') dpx[0][mx[0]] = true;
    else{
      dpx[0][mx[0]] = true;
      dpx[0][-mx[0]] = true;
    }

    //dpの操作

    REP2(i,1,xs){
      int movex = mx[i];
      for(auto x: dpx[i-1]){
        if(x.second){
          if(gx <= x.first + movex + xrem[i+1]||
           gx >= x.first + movex - xrem[i+1]){
            dpx[i][ x.first + movex] = true;
          }
          if(gx <= x.first - movex + xrem[i+1]||
           gx >= x.first - movex - xrem[i+1]){
            dpx[i][ x.first - movex] = true;
          }
        }
      }
    }
    if(dpx[xs-1].count(gx)){  //mapが存在するならば（存在するなら判定しなくてもtruedかも
      if(dpx[xs-1][gx]) isx = true;
    }
  }

  if(ys == 0){
    if(gy == 0) isy = true;
    else {
      cout << "No" << endl;
      return 0;
    }
  }
  else{



    vector<int> yrem(ys+1);
    int remain = 0;
    for(int i = ys; i >= 0; --i){
      yrem[i] = remain;
      remain += my[i];
    }

  dpy[0][my[0]] = true;
  dpy[0][-my[0]] = true;

  REP2(i,1,ys){
    int movey = my[i];
    for(auto y: dpy[i-1]){
      if(y.second){
        if(gx <= y.first + movey+yrem[i+1]||
        gx >=y.first + movey-yrem[i+1]){
          dpy[i][ y.first + movey] = true;
        }
        if(gx <= y.first - movey+yrem[i+1]||
        gx >=y.first - movey-yrem[i+1]){
          dpy[i][ y.first - movey] = true;
        }
      }
    }
  }
  if(dpy[ys-1].count(gy)) { //count mapが存在するなら１　存在しないなら０
    if(dpy[ys-1][gy]) isy = true;
  }
}

  // for(auto x : dpx[xs-1]) cout <<x.first << ":" << x.second << " ";
  // cout << endl;
  // for(auto x : dpy[ys-1]) cout <<x.first << ":" << x.second << " ";
  // cout << endl;

  // //実現可能かの確認
  if(isx && isy) cout << "Yes" << endl;
  else  cout << "No" << endl;

  return 0;
}


Measured memory_bytes: 191052