#include #include struct xorshift { uint32_t seed; xorshift() : seed(1231) {} xorshift(uint32_t v) : seed(v) {} uint32_t operator()() { seed ^= seed << 13; seed ^= seed >> 17; seed ^= seed << 5; return seed; } }; using namespace std; template auto hack() -> bitset { RNG rng; bitset a, b, c; b[DEG] = c[DEG] = 1; for (size_t l = 0, shift = 1; size_t n : views::iota(0u, DEG * 2)) { a >>= 1; a[DEG] = rng() & 1; if ((c & a).count() % 2 == 0) { shift += 1; continue; } auto oc = exchange(c, c ^ (b >> shift)); if (2 * l <= n) { l = n + 1 - l; b = oc; shift = 1; } else { shift += 1; } } return c; } auto main() -> int { constexpr size_t DEG = 100; const auto a = hack(); std::string t; std::cin >> t; int n; std::cin >> n; std::string c = "RSPX"; std::vector val(t.size() + n); for (int i = 0; i < t.size(); ++i) { val[i] = t[i] == 'R' ? 0 : t[i] == 'S' ? 1 : t[i] == 'P' ? 2 : 3; } for (int i = t.size(); i < val.size(); ++i) { uint32_t v = 0; for (size_t j = 0; j < DEG; ++j) { if (a[j]) v ^= val[i - DEG + j]; } val[i] = v; std::cout << c[(v + 3) % 4]; } std::cout << std::endl; /* uint32_t seed = 0; cin >> seed; xorshift rng(seed); size_t hash = 0; for (size_t i = 0; i <= DEG; i += 1) { auto h = rng(); if (a[i]) { hash ^= h; } } std::cout << hash << "\n"; assert(hash == 0); */ } // https://codeforces.com/blog/entry/153335 // ちゃんと理解してない