Problem p03986 (C++)

Buggy submission (status: Time Limit Exceeded):
#include "bits/stdc++.h"
#ifndef err
#define err(...) (void)0
#endif
using namespace std;
using ll = long long;
using ull = decltype(1ull);
template <class T> int size(T &&a) { return a.size(); }
#define REP(t, a)                                                              \
  for (make_signed<decltype(a.second)>::type t = a.first, _l##t = a.second;    \
       t < _l##t; t++)
#define RREP(t, a)                                                             \
  for (make_signed<decltype(a.second)>::type t = a.second - 1,                 \
                                             _l##t = a.first;                  \
       t >= _l##t; t--)
template <class B> pair<int, B> make_pair(B b) { return {0, b}; }
#define rep(t, ...) REP(t, make_pair(__VA_ARGS__))
#define rrep(t, ...) RREP(t, make_pair(__VA_ARGS__))
#define all(a) begin(a), end(a)
#define rall(a) a.rbegin(), a.rend()

void Calc();
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin.exceptions(istream::failbit | istream::badbit);
  cout << fixed << setprecision(15);
  Calc();
  cout.flush();
  return 0;
}
template <class A> void amax(A &a, A b) { a = max(a, b); }
template <class A> void amin(A &a, A b) { a = min(a, b); }
struct Scanner {
  template <class A = string> A Next() {
    A a;
    cin >> a;
    return a;
  }
  template <class A = int> vector<A> Array(int n) {
    vector<A> a(n);
    for (A &i : a)
      cin >> i;
    return a;
  }
  string Line() {
    string s;
    getline(cin, s);
    return s;
  }
  template <class A> Scanner &operator,(A &a) {
    a = Next<A>();
    return *this;
  }
  template <class A> operator A() { return Next<A>(); }
} in;

/*---------------------------------------------------------------------*/

void Calc() {
  string s = in;
  auto p = s.find("ST");
  while (p != s.npos) {
    int a = p, b = 2;
    /*   while (0 < a && a + b - 1 < size(s) && s[a - 1] == 'S' && s[a + b - 1]
       == 'T') { a--; b += 2;
       }*/
    s.erase(a, b);
    err(s);
    p = s.find("ST");
  }
  cout << (size(s)) << endl;
}


Fixed submission:
#include "bits/stdc++.h"
#ifndef err
#define err(...) (void)0
#endif
using namespace std;
using ll = long long;
using ull = decltype(1ull);
template <class T> int size(T &&a) { return a.size(); }
#define REP(t, a)                                                              \
  for (make_signed<decltype(a.second)>::type t = a.first, _l##t = a.second;    \
       t < _l##t; t++)
#define RREP(t, a)                                                             \
  for (make_signed<decltype(a.second)>::type t = a.second - 1,                 \
                                             _l##t = a.first;                  \
       t >= _l##t; t--)
template <class B> pair<int, B> make_pair(B b) { return {0, b}; }
#define rep(t, ...) REP(t, make_pair(__VA_ARGS__))
#define rrep(t, ...) RREP(t, make_pair(__VA_ARGS__))
#define all(a) begin(a), end(a)
#define rall(a) a.rbegin(), a.rend()

void Calc();
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin.exceptions(istream::failbit | istream::badbit);
  cout << fixed << setprecision(15);
  Calc();
  cout.flush();
  return 0;
}
template <class A> void amax(A &a, A b) { a = max(a, b); }
template <class A> void amin(A &a, A b) { a = min(a, b); }
struct Scanner {
  template <class A = string> A Next() {
    A a;
    cin >> a;
    return a;
  }
  template <class A = int> vector<A> Array(int n) {
    vector<A> a(n);
    for (A &i : a)
      cin >> i;
    return a;
  }
  string Line() {
    string s;
    getline(cin, s);
    return s;
  }
  template <class A> Scanner &operator,(A &a) {
    a = Next<A>();
    return *this;
  }
  template <class A> operator A() { return Next<A>(); }
} in;

/*---------------------------------------------------------------------*/

void Calc() {
  string s = in;
  auto p = s.find("ST");
  while (p != s.npos) {
    int a = p, b = 2;
    err(a - 1, a + b);
    while (0 < a && a + b < size(s) && s[a - 1] == 'S' && s[a + b] == 'T') {
      a--;
      b += 2;
    }
    s.erase(a, b);
    err(s);
    p = s.find("ST");
  }
  cout << (size(s)) << endl;
}