/*#pragma GCC target("arch=skylake-avx512") #pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops")*/ #include #include using namespace atcoder; using mint = modint998244353; using namespace std; template using vec = vector; using ll = long long; using ull = unsigned long long; using vi = vec; using vs = vec; using si = set; using sll = set; using vc = vec; using vvi = vec; using vll = vec; using vvll = vec; using vsi = vec; using vsll = vec; using pii = pair; using pll = pair; using mii = map; using mll = map; using msi = map; using vpii = vec; using vpll = vec; using spii = set; using spll = set; #define rep(i,j,n) for(ll i=j;i=j; i--) #define rp(i,n) rep(i,0,n) #define rrp(i,n) rrep(i,0,n) #define all(v) v.begin(), v.end() #define pb push_back #define ins insert #define yes cout<<"Yes"< void in(T&... X) { (cin >> ... >> X); }/* template void ain(vec& Y) { rp(K, Y.size()) cin >> Y[K]; } template void ain(set& Y, auto n) { rp(i, n) { T YY; cin >> YY; Y.insert(YY); } } template void ain(multiset& Y, auto n) { rp(i, n) { T YY; cin >> YY; Y.insert(YY); } }*/ template void bin(vec>& Z) { rp(L, Z.size()) ain(Z[L]); } template void aout(T& a) { for (auto I : a) cout << I << " "; cout << endl; } template void aout(queue a) { while (!a.empty()) { cout << a.front(); a.pop(); } } template void aout(stack a) { while (!a.empty()) { cout << a.top(); a.pop(); } } #define bout(a) {for(auto J:a) aout(J);} template bool chmin(T& M1, T M2) { if (M1 > M2) { M1 = M2; return 1; } else return 0; } template bool chmax(T& M1, T M2) { if (M1 < M2) { M1 = M2; return 1; } else return 0; } template auto vmax(T& a) { return *max_element(all(a)); } template auto vmin(T& a) { return *min_element(all(a)); } vector> rle(string rr) { vector> ret; char lc; rep(i, 0, rr.size()) { if (i > 0 && rr[i] == lc) ret[ret.sz - 1].second++; else { ret.pb({ rr[i],1 }); } lc = rr[i]; } return ret; } vector> rle(vi rr) { vector> ret; int lc; rep(i, 0, rr.size()) { if (i > 0 && rr[i] == lc) ret[ret.sz - 1].second++; else { ret.pb({ rr[i],1 }); } lc = rr[i]; } return ret; } vector> rle(vll rr) { vector> ret; ll lc; rep(i, 0, rr.size()) { if (i > 0 && rr[i] == lc) ret[ret.sz - 1].second++; else { ret.pb({ rr[i],1 }); } lc = rr[i]; } return ret; } template auto lwa(vector& a, T b) {//aでbより小さい最大の値のイテレータ auto i = lwb(all(a), b); if (i == a.begin()) return a.end(); else i--; return i; } template auto lwa(set& a, T b) {//aでbより小さい最大の値のイテレータ auto i = a.lwb(b); if (i == a.begin()) return a.end(); else i--; return i; } template auto lwa(multiset& a, T b) {//aでbより小さい最大の値のイテレータ auto i = a.lwb(b); if (i == a.begin()) return a.end(); else i--; return i; } template auto lwc(vector& a, T b) {//aでb以下の最大の値のイテレータ auto i = lwb(all(a), b); if (i != a.end() && *i == b) return i; if (i == a.begin()) return a.end(); else i--; return i; } template auto lwc(set& a, T b) {//aでb以下の最大の値のイテレータ auto i = a.lwb(b); if (i != a.end() && *i == b) return i; if (i == a.begin()) return a.end(); else i--; return i; } template auto lwc(multiset& a, T b) {//aでb以下の最大の値のイテレータ auto i = a.lwb(b); if (i != a.end() && *i == b) return i; if (i == a.begin()) return a.end(); else i--; return i; } template vec rsw(vec& a) {//累積和 vec b = a; rep(i, 1, b.size()) b[i] += b[i - 1]; return b; } bool kai(string S) {//回文か判定 bool ans = 1; rp(i, S.size()) if (S[i] != S[S.size() - 1 - i]) ans = 0; return ans; } sll yk(ll n) {//約数全列挙O(sqrt(N)),set sll yaku; for (ll i = 1; i * i <= n; i++) if (n % i == 0) { yaku.insert(i); yaku.insert(n / i); } return yaku; } vi ssa(int n) {//n:必要な素数の最大値 素数全列挙 vector prime; vectorlpf(n + 1, 0); rep(i, 2, n + 1) { if (lpf[i] == 0) { lpf[i] = i; prime.push_back(i); } for (int k : prime) { if (k * i > n || k > lpf[i]) break;//k最小素因数よりk<=i lpf[k * i] = k;//kを最小素因数に持つ数k*iを拾う } } return prime; } vector sib(ll x) {//素因数分解 if (x == 1) return vector(1, { 1,1 }); vector ans; for (ll i = 2; i * i <= x; i++) {//rootx回iを回しxで割る ll kaisu = 0; while (x % i == 0) { x /= i; kaisu++; } if (kaisu > 0) ans.pb({ i,kaisu }); } if (x != 1) ans.pb({ x,1 }); return ans; } template vec zat(vec a) {//座標圧縮 auto b = a; sort(all(b)); b.erase(unique(all(b)), b.end()); vec c(a.size()); rp(i, a.size()) { c[i] = lwb(all(b), a[i]) - b.begin(); } return c; } template void cp(map < T, ll >& a, T b, ll c) {//countplus if (a.find(b) == a.end()) a[b] = c; else a[b] += c; if (a[b] == 0) a.erase(b); } template vec inv(vec a) {//0-indexed 逆関数 vec ans(a.sz); rp(i, a.sz) { ans[a[i]] = i; } return ans; } //lazy_segtree seg(n); //S:中身型 op:左右合成 e:単位元(a・e=e・a=a) //F:遅延型 mapping:遅延適用後の要素 composition:遅延合成( 関数f(g()) ) id:遅延初期値(何もさせない) using S = pair; using F = pair; S op(S a,S b) { return { a.fi + b.fi,a.se + b.se }; } S e() { return { 0,0 }; } S mapping(F x, S a) {//xをaに作用(x初期値に注意) return { a.fi * x.fi + x.se * a.se,a.se }; } F composition(F f, F g) {//fの方が後(f初期値に注意) return {f.fi*g.fi,g.se*f.fi+f.se}; } F id() { return {1,0}; } //cout< 関数名 = [&](引数の型1 引数名1, 引数の型2, 引数名2, ...) int main() { int t; cin >> t; while (t--) { ll n; string s; cin >> n>>s; s.pb('-'); n++; bool r = 0,nn=0; int p=0, k = 0,t=0; rp(i, n) { if (s[i] != '-' && r==0) { r = 1; if (s[i] == 'P') nn = 0; else nn = 1; } if (s[i] == '-' && r == 1) { r = 0; if (s[i - 1] == 'P' && nn == 0) p++; else if (s[i - 1] == 'P') t++; else if (nn == 0) t++; else k++; } } if (p <= k) cout << "K"; else cout << "P"; cout << endl; } }