Problem p03488 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}

/* attention
    long longのシフト演算には気をつけよう
    タイポした時のデバッグが死ぬほどきつくなるので変数名は最低3字くらい使った方がいいかも
    sizeは(int)とキャストしよう
    ごちゃごちゃ場合分けを考える前に全探索は考えましたか？
*/

int main() {
  string s;
  cin >> s;
  int x, y;
  cin >> x >> y;

  vector<int> dx, dy;
  int Tcnt = 0, Fcnt = 0;

  for (int i = 0; i < s.size(); ++i) {
    if (i == s.size() - 1 && s[i] == 'F') {
      ++Fcnt;
      if (Tcnt % 2 == 0)
        dx.push_back(Fcnt);
      else
        dy.push_back(Fcnt);
    } else if (s[i] == 'F')
      ++Fcnt;
    else if (s[i] == 'T') {
      if (Tcnt % 2 == 0) {
        dx.push_back(Fcnt);
        Fcnt = 0;
        ++Tcnt;
      } else if (Tcnt % 2 == 1) {
        dy.push_back(Fcnt);
        Fcnt = 0;
        ++Tcnt;
      }
    }
  }

  // for(auto e:dx) cout << " " << e;
  // cout << endl;
  // for(auto e:dy) cout << " " << e;
  // cout << endl;

  vector<vector<bool>> dpx(dx.size() + 5, vector<bool>(16005, false)),
      dpy(dy.size() + 5, vector<bool>(16005, false));
  dpx[0][dx[0] + 8000] = true;

  if (dy.size()) {
    dpy[0][8000 + dy[0]] = true;
    dpy[0][8000 - dy[0]] = true;
  }

  for (int i = 0; i < dx.size() - 1; ++i) {
    for (int j = 0; j <= 16000; ++j) {
      if (dx[i + 1] <= j)
        dpx[i + 1][j - dx[i + 1]] = dpx[i + 1][j - dx[i + 1]] || dpx[i][j];
      if (j + dx[i + 1] <= 16000)
        dpx[i + 1][j + dx[i + 1]] = dpx[i + 1][j + dx[i + 1]] || dpx[i][j];
    }
  }

  for (int i = 0; i < dy.size() - 1; ++i) {
    for (int j = 0; j <= 16000; ++j) {
      if (dy[i + 1] <= j)
        dpy[i + 1][j - dy[i + 1]] = dpy[i + 1][j - dy[i + 1]] || dpy[i][j];
      if (j + dy[i + 1] <= 16000)
        dpy[i + 1][j + dy[i + 1]] = dpy[i + 1][j + dy[i + 1]] || dpy[i][j];
    }
  }

  if (dy.size() == 0) {
    if (dpx[dx.size() - 1][x + 8000] && y == 0) {
      cout << "Yes" << endl;
    } else {
      cout << "No" << endl;
    }
  } else {
    if (dpx[dx.size() - 1][x + 8000] && dpy[dy.size() - 1][y + 8000]) {
      cout << "Yes" << endl;
    } else {
      cout << "No" << endl;
    }
  }
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}

/* attention
    long longのシフト演算には気をつけよう
    タイポした時のデバッグが死ぬほどきつくなるので変数名は最低3字くらい使った方がいいかも
    sizeは(int)とキャストしよう
    ごちゃごちゃ場合分けを考える前に全探索は考えましたか？
*/

int main() {
  string s;
  cin >> s;
  int x, y;
  cin >> x >> y;

  vector<int> dx, dy;
  int Tcnt = 0, Fcnt = 0;

  for (int i = 0; i < s.size(); ++i) {
    if (i == s.size() - 1 && s[i] == 'F') {
      ++Fcnt;
      if (Tcnt % 2 == 0)
        dx.push_back(Fcnt);
      else
        dy.push_back(Fcnt);
    } else if (s[i] == 'F')
      ++Fcnt;
    else if (s[i] == 'T') {
      if (Tcnt % 2 == 0) {
        dx.push_back(Fcnt);
        Fcnt = 0;
        ++Tcnt;
      } else if (Tcnt % 2 == 1) {
        dy.push_back(Fcnt);
        Fcnt = 0;
        ++Tcnt;
      }
    }
  }

  // for(auto e:dx) cout << " " << e;
  // cout << endl;
  // for(auto e:dy) cout << " " << e;
  // cout << endl;

  vector<vector<bool>> dpx(dx.size() + 5, vector<bool>(16005, false)),
      dpy(dy.size() + 5, vector<bool>(16005, false));
  dpx[0][dx[0] + 8000] = true;

  if (dy.size()) {
    dpy[0][8000 + dy[0]] = true;
    dpy[0][8000 - dy[0]] = true;
  }

  for (int i = 0; i < dx.size() - 1; ++i) {
    for (int j = 0; j <= 16000; ++j) {
      if (dx[i + 1] <= j)
        dpx[i + 1][j - dx[i + 1]] = dpx[i + 1][j - dx[i + 1]] || dpx[i][j];
      if (j + dx[i + 1] <= 16000)
        dpx[i + 1][j + dx[i + 1]] = dpx[i + 1][j + dx[i + 1]] || dpx[i][j];
    }
  }

  for (int i = 0; i < (int)dy.size() - 1; ++i) {
    for (int j = 0; j <= 16000; ++j) {
      if (dy[i + 1] <= j)
        dpy[i + 1][j - dy[i + 1]] = dpy[i + 1][j - dy[i + 1]] || dpy[i][j];
      if (j + dy[i + 1] <= 16000)
        dpy[i + 1][j + dy[i + 1]] = dpy[i + 1][j + dy[i + 1]] || dpy[i][j];
    }
  }

  if (dy.size() == 0) {
    if (dpx[dx.size() - 1][x + 8000] && y == 0) {
      cout << "Yes" << endl;
    } else {
      cout << "No" << endl;
    }
  } else {
    if (dpx[dx.size() - 1][x + 8000] && dpy[dy.size() - 1][y + 8000]) {
      cout << "Yes" << endl;
    } else {
      cout << "No" << endl;
    }
  }
}