#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define st first
#define nd second
#define pb push_back
#define all(a) a.begin(), a.end()
#define sz(a) int(a.size())
#define f(i, a, b) for (int i = a; i < b; i++)
#define rep(i, a) f(i, 0, a)
#define int ll
#define tv(a, x) for (auto& a : x)
#define DUZO 1000000000000000000LL
#define en "\n"
#define cn continue
using pii = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;
using vii = vector<pii>;
mt19937_64 gen(chrono::high_resolution_clock::now().time_since_epoch().count());
int los(int l, int r) {
return (l + (gen()%(r - l + 1)));
}
vector<char> graj = {'P', 'K', 'N'}; //i pokonuje i + 1 mod 3 i przegrywa z i - 1 mod 3
vi zz = {712180668212679159,288624051043449571,119128944650237619,365365330082142438,1034182755493330078,527402025249061984,1012575089404784162,468242309947731303,294641657342345168,703249593855564388,331692663242897798,888817293432380814,390122495668243499,237987583683890754,885320229947258264,539667379909400563,12416009573702869,378052727401855610,312983807275524544,653673854063370370,844958418215559183,1063615484742523357,464300249990597392,515787990415499103,509238493644796515,493822406672726453,334870301084787256,625677455564152457,596690160420994921,511166464389021148,782202153597712392,1151523248955611198,1028302130894971359,633224875628916524,663965993094934724,547326588377536857,972760581849457009,1050965058659749163,862760375669955862,925969819084559919,750870234577481463,579971341148684653,984788520706764349,14846906683520398,792445609929575716,239005113714325138,177520573256988782,733640867780666991,1118345372354697088,269284174885908398,908656344585980939,314918652483923642,900045421907826482,111566892470416574,497505319128035827,241172229136940565,847951790256536633,588907800486901460,139370382963858499,1146355121086592303,628730245586792956,1111066748467004243,408512136725376906,51735309873600477,800218367612779907,606697255327649569,822382233059153405,972090976364679305,126198476938066845,187827615221755195,681701092536511223,254142601478746888,703635143785563343,501208451602469469,75564449456684056,885222004874326916,1036910444420983040,705832568270505453,1104997460318057889,920069904077250,295490542134447597,110203348768440168,422351136423568115,847672315130386169};
int il = 60;
int n;
vi a;
vi b;
int wsk;
int kto;
void odp() {
f(i, 0, n) {
if (zz[i/il]&((int)1 << (i%il))) b[i] ^= 1;
}
cout << "! ";
f(i, 0, n) cout << b[i];
cout << en;
cout.flush();
}
int zagraj(int ind) {
cout << graj[ind] << en;
cout.flush();
char z;
cin >> z;
f(j, 0, 3) {
if (z == graj[j]) {
return j;
}
}
}
int dodaj(int moje, int prze) {
if (moje == prze) return 0;
if ((moje + 1)%3 == prze) return 1;
return -1;
}
void solve() {
f(i, 0, n) { //zmieniamy na ta jaka na prawde przekazemy
if (zz[i/il]&((int)1 << (i%il))) a[i] ^= 1;
}
f(i, 0, n * 20) {
a.pb(los(0, 1)); //dla bezpieczenstwa by mial pozniej i tak co przekazywac
}
wsk = 0; //ile zna wrog
b = {}; //to co nam wrog dal
int bil = 0; //bilans
while (true) {
if (wsk >= n && sz(b) >= n) {
odp();
return;
}
if (bil == 0) {
//trzeba przekazac kolejne
if (a[wsk] == 0) {
int val = zagraj(a[wsk + 1]);
bil += dodaj(a[wsk + 1], val);
if (val == 2) {
b.pb(1);
} else {
b.pb(0);
b.pb(val);
}
wsk += 2;
} else {
int val = zagraj(2);
bil += dodaj(2, val);
if (val == 2) {
b.pb(1);
} else {
b.pb(0);
b.pb(val);
}
wsk++;
}
} else if (bil == 1) { //to jest wersja na pale czyli wygryw daje 1
if ((wsk + kto) > sz(b)) { //ja mam zdobyc info p1
int val = zagraj(1);
bil += dodaj(1, val);
b.pb(val);
} else { //p2
int val = zagraj(a[wsk]);
bil += dodaj(a[wsk], val);
wsk++;
}
} else if (bil == -1) { //ja mu daje info
if ((wsk + kto) > sz(b)) { //p2
int val = zagraj(0);
bil += dodaj(0, val);
b.pb(val);
} else { //p1
int val = zagraj(a[wsk]);
bil += dodaj(a[wsk], val); //val to 1
wsk++;
}
}
}
}
int32_t main() {
ios::sync_with_stdio(0);
cin.tie(0);
int q;
string s;
cin >> s;
if (s[0] == 'A') kto = 0;
else kto = 1;
cin >> n >> q;
while (q--) {
a = {};
a.resize(n);
f(i, 0, n) {
char z;
cin >> z;
a[i] = z - '0';
}
solve();
}
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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 | #include <bits/stdc++.h> using namespace std; typedef long long ll; #define st first #define nd second #define pb push_back #define all(a) a.begin(), a.end() #define sz(a) int(a.size()) #define f(i, a, b) for (int i = a; i < b; i++) #define rep(i, a) f(i, 0, a) #define int ll #define tv(a, x) for (auto& a : x) #define DUZO 1000000000000000000LL #define en "\n" #define cn continue using pii = pair<int, int>; using vi = vector<int>; using vvi = vector<vi>; using vii = vector<pii>; mt19937_64 gen(chrono::high_resolution_clock::now().time_since_epoch().count()); int los(int l, int r) { return (l + (gen()%(r - l + 1))); } vector<char> graj = {'P', 'K', 'N'}; //i pokonuje i + 1 mod 3 i przegrywa z i - 1 mod 3 vi zz = {712180668212679159,288624051043449571,119128944650237619,365365330082142438,1034182755493330078,527402025249061984,1012575089404784162,468242309947731303,294641657342345168,703249593855564388,331692663242897798,888817293432380814,390122495668243499,237987583683890754,885320229947258264,539667379909400563,12416009573702869,378052727401855610,312983807275524544,653673854063370370,844958418215559183,1063615484742523357,464300249990597392,515787990415499103,509238493644796515,493822406672726453,334870301084787256,625677455564152457,596690160420994921,511166464389021148,782202153597712392,1151523248955611198,1028302130894971359,633224875628916524,663965993094934724,547326588377536857,972760581849457009,1050965058659749163,862760375669955862,925969819084559919,750870234577481463,579971341148684653,984788520706764349,14846906683520398,792445609929575716,239005113714325138,177520573256988782,733640867780666991,1118345372354697088,269284174885908398,908656344585980939,314918652483923642,900045421907826482,111566892470416574,497505319128035827,241172229136940565,847951790256536633,588907800486901460,139370382963858499,1146355121086592303,628730245586792956,1111066748467004243,408512136725376906,51735309873600477,800218367612779907,606697255327649569,822382233059153405,972090976364679305,126198476938066845,187827615221755195,681701092536511223,254142601478746888,703635143785563343,501208451602469469,75564449456684056,885222004874326916,1036910444420983040,705832568270505453,1104997460318057889,920069904077250,295490542134447597,110203348768440168,422351136423568115,847672315130386169}; int il = 60; int n; vi a; vi b; int wsk; int kto; void odp() { f(i, 0, n) { if (zz[i/il]&((int)1 << (i%il))) b[i] ^= 1; } cout << "! "; f(i, 0, n) cout << b[i]; cout << en; cout.flush(); } int zagraj(int ind) { cout << graj[ind] << en; cout.flush(); char z; cin >> z; f(j, 0, 3) { if (z == graj[j]) { return j; } } } int dodaj(int moje, int prze) { if (moje == prze) return 0; if ((moje + 1)%3 == prze) return 1; return -1; } void solve() { f(i, 0, n) { //zmieniamy na ta jaka na prawde przekazemy if (zz[i/il]&((int)1 << (i%il))) a[i] ^= 1; } f(i, 0, n * 20) { a.pb(los(0, 1)); //dla bezpieczenstwa by mial pozniej i tak co przekazywac } wsk = 0; //ile zna wrog b = {}; //to co nam wrog dal int bil = 0; //bilans while (true) { if (wsk >= n && sz(b) >= n) { odp(); return; } if (bil == 0) { //trzeba przekazac kolejne if (a[wsk] == 0) { int val = zagraj(a[wsk + 1]); bil += dodaj(a[wsk + 1], val); if (val == 2) { b.pb(1); } else { b.pb(0); b.pb(val); } wsk += 2; } else { int val = zagraj(2); bil += dodaj(2, val); if (val == 2) { b.pb(1); } else { b.pb(0); b.pb(val); } wsk++; } } else if (bil == 1) { //to jest wersja na pale czyli wygryw daje 1 if ((wsk + kto) > sz(b)) { //ja mam zdobyc info p1 int val = zagraj(1); bil += dodaj(1, val); b.pb(val); } else { //p2 int val = zagraj(a[wsk]); bil += dodaj(a[wsk], val); wsk++; } } else if (bil == -1) { //ja mu daje info if ((wsk + kto) > sz(b)) { //p2 int val = zagraj(0); bil += dodaj(0, val); b.pb(val); } else { //p1 int val = zagraj(a[wsk]); bil += dodaj(a[wsk], val); //val to 1 wsk++; } } } } int32_t main() { ios::sync_with_stdio(0); cin.tie(0); int q; string s; cin >> s; if (s[0] == 'A') kto = 0; else kto = 1; cin >> n >> q; while (q--) { a = {}; a.resize(n); f(i, 0, n) { char z; cin >> z; a[i] = z - '0'; } solve(); } return 0; } |
English