Problem p02671 (C++) — buggy submission, verdict: Time Limit Exceeded

/*input
3
SRSRRSRRRSRRRR
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef tree<long long, null_type, less_equal<long long>, rb_tree_tag,
             tree_order_statistics_node_update>
    indexed_set;
#pragma GCC optimize("unroll-loops,no-stack-protector")
// order_of_key #of elements less than x
//  find_by_order kth element
typedef long long int ll;
#define ld double
#define pii pair<ll, ll>
#define f first
#define s second
#define pb push_back
#define REP(i, n) for (int i = 0; i < n; i++)
#define REP1(i, n) for (int i = 1; i <= n; i++)
#define FILL(n, x) memset(n, x, sizeof(n))
#define ALL(_a) _a.begin(), _a.end()
#define sz(x) (int)x.size()
const ll maxn = 6e5 + 5;
const ll maxlg = __lg(maxn) + 2;
const ll INF64 = 4e18;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;
const ld PI = acos(-1);
const ld eps = 1e-9;
#define lowb(x) x & (-x)
#define MNTO(x, y) x = min(x, (__typeof__(x))y)
#define MXTO(x, y) x = max(x, (__typeof__(x))y)
#define SORT_UNIQUE(c)                                                         \\
  (sort(c.begin(), c.end()),                                                   \\
   c.resize(distance(c.begin(), unique(c.begin(), c.end()))))
#define GET_POS(c, x) (lower_bound(c.begin(), c.end(), x) - c.begin())
#define MP make_pair
ll mult(ll a, ll b) {
  ll res = 0LL;
  while (b) {
    if (b & 1)
      res = (res + a) % MOD;
    a = (a + a) % MOD;
    b >>= 1;
  }
  return res % MOD;
}
ll mypow(ll a, ll b) {
  ll res = 1LL;
  while (b) {
    if (b & 1)
      res = res * a % MOD;
    a = a * a % MOD;
    b >>= 1;
  }
  return res;
}
int ans[13][maxn];
string nxt[13][maxn];
int main() {
  int lvl;
  string t;
  cin >> lvl >> t;
  string s = "";
  for (int i = 0; i < sz(t);) {
    if (t[i] == 'S') {
      int c = i;
      while (t[i] == 'S') {
        ++i;
      }
      if ((c - i) % 2)
        s += 'S';
    } else {
      s += 'R';
      ++i;
    }
  }
  ans[0][0] = 0;
  nxt[0][0] = s;
  int suff = 1;
  REP1(i, lvl) {
    REP(bt, 3) {
      REP(sf, suff) {
        int cur = bt;
        int n = bt * suff + sf;
        for (auto x : nxt[i - 1][sf]) {
          if (x == 'S') {
            if (cur)
              cur = 3 - cur;
            if (sz(nxt[i][n]) and nxt[i][n].back() == 'S') {
              nxt[i][n].pop_back();
            } else {
              nxt[i][n].pb('S');
            }
          } else {
            ++cur;
            if (cur == 3) {
              nxt[i][n].pb('R');
              cur = 0;
            }
          }
        }
        ans[i][n] = ans[i - 1][sf] + cur * suff;
      }
    }
    suff *= 3;
  }
  REP(i, mypow(3, lvl)) { cout << ans[lvl][i] << ' '; }
}

Error: TLE

Fixed submission:

/*input
2
RRSRR
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef tree<long long, null_type, less_equal<long long>, rb_tree_tag,
             tree_order_statistics_node_update>
    indexed_set;
#pragma GCC optimize("unroll-loops,no-stack-protector")
// order_of_key #of elements less than x
//  find_by_order kth element
typedef long long int ll;
#define ld double
#define pii pair<ll, ll>
#define f first
#define s second
#define pb push_back
#define REP(i, n) for (int i = 0; i < n; i++)
#define REP1(i, n) for (int i = 1; i <= n; i++)
#define FILL(n, x) memset(n, x, sizeof(n))
#define ALL(_a) _a.begin(), _a.end()
#define sz(x) (int)x.size()
const ll maxn = 1e6 + 5;
const ll maxlg = __lg(maxn) + 2;
const ll INF64 = 4e18;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;
const ld PI = acos(-1);
const ld eps = 1e-9;
#define lowb(x) x & (-x)
#define MNTO(x, y) x = min(x, (__typeof__(x))y)
#define MXTO(x, y) x = max(x, (__typeof__(x))y)
#define SORT_UNIQUE(c)                                                         \\
  (sort(c.begin(), c.end()),                                                   \\
   c.resize(distance(c.begin(), unique(c.begin(), c.end()))))
#define GET_POS(c, x) (lower_bound(c.begin(), c.end(), x) - c.begin())
#define MP make_pair
ll mult(ll a, ll b) {
  ll res = 0LL;
  while (b) {
    if (b & 1)
      res = (res + a) % MOD;
    a = (a + a) % MOD;
    b >>= 1;
  }
  return res % MOD;
}
ll mypow(ll a, ll b) {
  ll res = 1LL;
  while (b) {
    if (b & 1)
      res = res * a % MOD;
    a = a * a % MOD;
    b >>= 1;
  }
  return res;
}
int ans[maxn];
int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  int n;
  cin >> n;
  int z = mypow(3, n);
  REP(i, z) {
    int x = i;
    int opp = 0;
    vector<int> v;
    while (x > 0) {
      if (x % 3 == 1)
        v.pb(2);
      else if (x % 3 == 2)
        v.pb(1);
      else
        v.pb(0);
      x /= 3;
    }
    reverse(ALL(v));
    REP(i, sz(v)) opp = opp * 3 + v[i];
    ans[i] = opp;
  }
  string s;
  cin >> s;
  string nw = "";
  vector<int> v;
  for (int i = 0; i < sz(s);) {
    if (s[i] == 'S') {
      int c = i;
      while (i < sz(s) and s[i] == 'S')
        ++i;
      if ((i - c) % 2)
        v.pb(-1);
    } else {
      int c = i;
      while (i < sz(s) and s[i] == 'R')
        ++i;
      v.pb(i - c);
    }
  }
  REP(i, z) {
    int cur = i;
    for (int x : v) {
      if (x > 0) {
        cur += x;
        if (cur >= z)
          cur %= z;
      } else
        cur = ans[cur];
    }
    cout << cur << ' ';
  }
}