[AtCoder] ARC 109 C – Large RPS Tournament

2020年12月12日

問題

方針

参加者が出す手は周期性を持ち、最初に出す手は周期 \( n \) で変わります。ここで、\( T_0 = ss \) とします。ここで、\( f(t) \) を文字列 \( t \) を出す参加者で勝利した文字列とします。\( T_i = f(T_{i – 1})f(T_{i – 1})\) とすると、\( T_k \) の先頭の文字列が答えとなります。

コード

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

// (int) P < R < S
char winner(char c1, char c2) {
    if (c1 == c2) return c1;
    if (c1 > c2) {
        swap(c1, c2);
    }
    // c1 < c2
    if (c1 == 'P') {
        if (c2 == 'R') return 'P';
        else return 'S';
    } else {
        return 'R';
    }
}

int main() {
    int n, k;
    string s;
    cin >> n >> k >> s;
    s = s + s;
    for (int i = 0; i < k; i++) {
        string t = "";
        for (int j = 0; j < 2 * n; j++) {
            t += winner(s[2 * j], s[2 * j + 1]);
        }
        s = t + t;
        cout << s << "\n";
    }
    cout << s[0] << "\n";
    return 0;
}

感想

あまり理解していません。