arc109_c - Large Rps Tournament

  • $dp(k, l)$: winner of tournament that starts at position $l$ in string and has $2^k$ players.

Time complexity: $O(n^2)$

Memory complexity: $O(n^3)$

Click to show code.


using namespace std;
using ll = long long;
using ii = pair<int, int>;
using vi = vector<int>;
int const NMAX = 1e2 + 5;
int n, k;
char dp[NMAX][NMAX];
string s;
ll binpow(ll a, ll b)
{
    a %= n;
    ll res = 1;
    while (b > 0)
    {
        if (b & 1)
            res = res * a % n;
        a = a * a % n;
        b >>= 1;
    }
    return res;
}
char op(char a, char b)
{
    if (a == b)
        return a;
    if ((a == 'P' and b == 'R') or (a == 'S' and (b == 'R' or b == 'P')))
        swap(a, b);
    if (a == 'R' and b == 'P')
        return b;
    else if (a == 'R' and b == 'S')
        return 'R';
    else
        return 'S';
}
char solve(int l, int w)
{
    char &ans = dp[w][l];
    if (ans)
        return ans;
    else if (w == 0)
        return s[l];
    else
    {
        return ans = op(solve(l, w - 1),
                        solve((l + binpow(2, w - 1)) % n, w - 1));
    }
}
int main(void)
{
    ios::sync_with_stdio(false), cin.tie(NULL);
    cin >> n >> k >> s;
    cout << solve(0, k) << endl;
    return 0;
}