#include<bits/stdc++.h>
using namespace std;
mt19937 rng(556366);
const int N=5000,L=3155;
const string S="PKN";
inline int getn(char c){
for(int i=0;i<3;i++)
if(S[i]==c)return i;
return -1;
}
vector<int> encode(vector<int> b){
vector<int> t;
while(!b.empty()){
int r=0;
for(int i=0;i<b.size();i++)
if(b[i])r+=i&1?2:1;
t.emplace_back(r%3);
for(int i=b.size()-1,x=0;~i;i--)
b[i]=(x=x<<1|b[i])/3,x%=3;
while(!b.empty()&&!b.back())b.pop_back();
}
while(t.size()<L)t.emplace_back(0);
return t;
}
vector<int> decode(vector<int> t,int n){
vector<int> b;
while(!t.empty()){
int r=0;
for(int i=0;i<t.size();i++)
if(t[i]&1)r^=1;
b.emplace_back(r);
for(int i=t.size()-1,x=0;~i;i--)
t[i]=(x=x*3+t[i])>>1,x&=1;
for(int i=0;i+1<t.size();i++)
if(t[i]>2)t[i+1]+=t[i]/3,t[i]%=3;
while(!t.empty()&&!t.back())t.pop_back();
}
while(!b.empty()&&!b.back())b.pop_back();
while(b.size()<n)b.emplace_back(0);
return b;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
string tp; int t,n; cin>>tp>>n>>t;
vector<int> Xa(n),Xb(n);
generate(Xa.begin(),Xa.end(),[&](){return rng()&1;});
generate(Xb.begin(),Xb.end(),[&](){return rng()&1;});
auto encrypt=[&](vector<int> b,char tp){
for(int i=0;i<n;i++)
b[i]^=tp=='A'?Xa[i]:Xb[i];
return b;
};
auto decrypt=[&](vector<int> b,char tp){
return encrypt(b,tp=='A'?'B':'A');
};
while(t--){
vector<int> b(n);
for(auto &i:b){
char c; cin>>c,i=c&1;
}
auto t=encode(encrypt(b,tp[0]));
vector<int> r;
for(int i=0,d=0;i<L;i++){
if(d>0){
cout<<'K'<<endl;
char c; cin>>c,d=0;
}
if(d<0){
cout<<'P'<<endl;
char c; cin>>c,d=0;
}
cout<<S[t[i]]<<endl;
char c; cin>>c;
int x=getn(c),e=(x-t[i]+3)%3;
r.emplace_back(x),d+=e<=1?e:-1;
}
b=decrypt(decode(r,n),tp[0]);
cout<<"! ";
for(int i:b)cout<<i;
cout<<endl;
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | #include<bits/stdc++.h> using namespace std; mt19937 rng(556366); const int N=5000,L=3155; const string S="PKN"; inline int getn(char c){ for(int i=0;i<3;i++) if(S[i]==c)return i; return -1; } vector<int> encode(vector<int> b){ vector<int> t; while(!b.empty()){ int r=0; for(int i=0;i<b.size();i++) if(b[i])r+=i&1?2:1; t.emplace_back(r%3); for(int i=b.size()-1,x=0;~i;i--) b[i]=(x=x<<1|b[i])/3,x%=3; while(!b.empty()&&!b.back())b.pop_back(); } while(t.size()<L)t.emplace_back(0); return t; } vector<int> decode(vector<int> t,int n){ vector<int> b; while(!t.empty()){ int r=0; for(int i=0;i<t.size();i++) if(t[i]&1)r^=1; b.emplace_back(r); for(int i=t.size()-1,x=0;~i;i--) t[i]=(x=x*3+t[i])>>1,x&=1; for(int i=0;i+1<t.size();i++) if(t[i]>2)t[i+1]+=t[i]/3,t[i]%=3; while(!t.empty()&&!t.back())t.pop_back(); } while(!b.empty()&&!b.back())b.pop_back(); while(b.size()<n)b.emplace_back(0); return b; } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); string tp; int t,n; cin>>tp>>n>>t; vector<int> Xa(n),Xb(n); generate(Xa.begin(),Xa.end(),[&](){return rng()&1;}); generate(Xb.begin(),Xb.end(),[&](){return rng()&1;}); auto encrypt=[&](vector<int> b,char tp){ for(int i=0;i<n;i++) b[i]^=tp=='A'?Xa[i]:Xb[i]; return b; }; auto decrypt=[&](vector<int> b,char tp){ return encrypt(b,tp=='A'?'B':'A'); }; while(t--){ vector<int> b(n); for(auto &i:b){ char c; cin>>c,i=c&1; } auto t=encode(encrypt(b,tp[0])); vector<int> r; for(int i=0,d=0;i<L;i++){ if(d>0){ cout<<'K'<<endl; char c; cin>>c,d=0; } if(d<0){ cout<<'P'<<endl; char c; cin>>c,d=0; } cout<<S[t[i]]<<endl; char c; cin>>c; int x=getn(c),e=(x-t[i]+3)%3; r.emplace_back(x),d+=e<=1?e:-1; } b=decrypt(decode(r,n),tp[0]); cout<<"! "; for(int i:b)cout<<i; cout<<endl; } return 0; } |
English