import scala.io.{StdIn => in}
import scala.collection.{mutable => mu}

object Main extends App {
  val s = in.readLine
  val Array(x, y) = in.readLine.split(" ").map(_.toInt)
  val bufX = mu.ArrayBuffer.empty[Int]
  val bufY = mu.ArrayBuffer.empty[Int]
  val (coordX, coordY) = {
    var cnt = 0
    var isEven = true
    bufX += 0
    s.foreach(ch => {
      if(ch == 'T') {
        isEven = isEven ^ true
        if(isEven) {
          bufX += 0
          cnt += 1
        }
        else {
          bufY += 0
        }
      }
      else {
        if(isEven) bufX(cnt) += 1
        else bufY(cnt) += 1
      }
    })
    (bufX.sum, bufY.sum)
  }
  // debug(bufX.mkString(" "))
  // debug(bufY.mkString(" "))

  val corr = (coordX + coordY) * 2 + 10 //座標のマイナスを補正する
  val coordMax = 2 * corr + 10
  // debug(corr)
  val x2 = x + corr
  val y2 = y + corr
  // テーブル構築 : dp(i)(j)でi回目の操作で座標軸上の n + corr に居られるか
  val dpx = Array.ofDim[Boolean](bufX.size + 1, coordMax)
  val dpy = Array.ofDim[Boolean](bufY.size + 1, coordMax)
  dpx(0)(corr) = true
  dpy(0)(corr) = true

  // 最初の向きは固定
  if(dpx.size > 1) dpx(1)(corr + bufX(0)) = true

  for{
    i <- 1 until bufX.size
    j <- 0 until coordMax
  } {
    if(dpx(i)(j)) {
      // debug(i+1,j-bufX(i),j+bufX(i))
      if(j - bufX(i) >= 0) dpx(i+1)(j-bufX(i)) = true
      if(j + bufX(i) >= 0) dpx(i+1)(j+bufX(i)) = true
    }
  }
  for{
    i <- 0 until bufY.size
    j <- 0 until coordMax
  } {
    if(dpx(i)(j)) {
      // debug(bufY.size, i+1,j-bufY(i),j+bufY(i))
      if(j - bufY(i) >= 0) dpy(i+1)(j-bufY(i)) = true
      if(j + bufY(i) >= 0) dpy(i+1)(j+bufY(i)) = true
    }
  }

  // debug(dpx.size, dpy.size)
  // debug(bufX.size, x2, bufY.size, y2)
  val ans = if(dpx(bufX.size)(x2) && dpy(bufY.size)(y2)) "Yes" else "No"
  println(ans)

  def debug(any:Any*):Unit = {
    if(this.getClass.toString == "class Main$") return
    println(any.mkString(" "))
  }
}