#include <bits/stdc++.h>
#define rep(i,n) for(int64_t i=0;i < (int64_t)(n);i++)
#define invrep(i,n) for(int64_t i=n-1;i >= 0;i--)
using namespace std;

//////全探索したいときに開けよ////////
vector<vector<int>> fspattern;
vector<int> fspattern_draft;
int fspcnt = 0;

void setfspattern_core(int floor,int number,int degree){
  if(floor==degree){
    fspattern.at(fspcnt) = fspattern_draft;
    fspcnt++;
  }else{
    rep(i,number){
      fspattern_draft.at(floor) = i;
      setfspattern_core(floor+1,number,degree);
    }
  }
}

void setfspattern(int number,int degree){
  fspcnt = 0;
  int64_t array_num = 1;
  rep(i,degree){
    array_num *= number;
  }
  fspattern = vector<vector<int>>(array_num,vector<int>(degree));
  fspattern_draft = vector<int>(degree);
  setfspattern_core(0,number,degree);
}

//////nCrのmodを求めたいときに開けよ/////////
//int64_t univMod = 1000000007;
//int64_t factnum = 100000
//vector<int64_t> modfact(factnum);
//vector<int64_t> modinvfact(factnum);

/*void setmodfact(){
  for(int i=0;i<factnum;i++){
    if(i == 0){
      modfact.at(i) = 1;
    }else{
      modfact.at(i) = (modfact.at(i-1)*i)%univMod;
    }
  }
}

int64_t calcmodpower(int64_t a,int64_t n){
  int64_t res = 1;
  while(n != 0){
    if(n & 1){
      res = (res * a) % univMod;
    }
    a = (a*a) % univMod;
    n = n >> 1;
  }
  return res;
}

int64_t calcinverse(int64_t n){
	return calcmodpower(n,univMod-2);
}

void setmodinvfact(){
  for(int i=0;i<factnum;i++){
    if(i==0){
      modinvfact.at(i) = 1;
    }else{
      modinvfact.at(i) = calcmodpower(modfact.at(i),univMod-2);
    }
  }
}*/


/*
int64_t calcGCD(int64_t a,int64_t b){
	int64_t p = a;
	int64_t q = b;
	int64_t c = a%b;
	while(c != 0){
		p = q;
		q = c;
		c = p%q;
	}
	return q;
}
*/

int main(){
  string s;
  cin >> s;
  int x,y;
  cin >> x >> y;
  int n = s.size();
  vector<int> UD;
  vector<int> LR;
  int initx = 0;
  bool initflag = true;
  bool direction = true;
  rep(i,n){
    if(initflag){
      if(s.at(i) == 'F'){
        initx++;
      }else{
        direction = true;
        initflag = false;
        UD.push_back(0);
      }
    }else{
      if(direction){ // UD
        if(s.at(i) == 'F'){
          UD.back()++;
        }else{
          direction = false;
          LR.push_back(0);
        }
      }else{ // LR
        if(s.at(i) == 'F'){
          LR.back()++;
        }else{
          direction = true;
          UD.push_back(0);
        }
      }
    }
  }
  int udn = UD.size();
  int lrn = LR.size();
  vector<vector<bool>> UDDP(udn+1,vector<bool>(20000));
  UDDP.at(0).at(10000) = true;
  rep(i,udn){
    rep(j,20000){
      if(0 <= j-UD.at(i) && j -UD.at(i) <= 19999){
        UDDP.at(i+1).at(j) = UDDP.at(i).at(j-UD.at(i));
      }
      if(0 <= j+UD.at(i) && j +UD.at(i) <= 19999){
        UDDP.at(i+1).at(j) = UDDP.at(i).at(j+UD.at(i)) || UDDP.at(i+1).at(j);
      }
    }
  }
  vector<vector<bool>> LRDP(lrn+1,vector<bool>(20000));
  LRDP.at(0).at(10000+initx) = true;
  rep(i,lrn){
    rep(j,20000){
      if(0 <= j-LR.at(i) && j -LR.at(i) <= 19999){
        LRDP.at(i+1).at(j) = LRDP.at(i).at(j-LR.at(i));
      }
      if(0 <= j+LR.at(i) && j +LR.at(i) <= 19999){
        LRDP.at(i+1).at(j) = LRDP.at(i).at(j+LR.at(i)) || LRDP.at(i+1).at(j);
      }
    }
  }
  if(LRDP.at(lrn).at(10000+x) && UDDP.at(udn).at(10000+y)){
    cout << "Yes" << endl;
  }else{
    cout << "No" << endl;
  }

  
  
  
      
          
    
  /*rep(i,LR.size()){
    cout << LR.at(i) << ",";
  }
  cout << endl;
  rep(i,UD.size()){
    cout << UD.at(i) << ",";
  }
  cout << endl;
  cout << initx;*/
      
    
  
  
}

Measured memory_bytes: 20096