#include <bits/stdc++.h>
using namespace std;
#define loop(i, a, b) for(int i = a; i <= b; i++)
#define loop_rev(i, a, b) for(int i = a; i >= b; i--)
#define all(x) x.begin(), x.end()
#define sz(x) int(x.size())
#define eb emplace_back
#define pb push_back
using ull = uint64_t;
using ll = int64_t;
struct TreNum {
vector<ull> digits;
int n, len;
ull pow39 = 1;
TreNum(int _n) {
len = ((n = _n) + 38) / 39;
digits.resize(len);
for(int i = 1; i <= 39; i++) {
pow39 *= 3;
}
}
void mul2() {
ull carry = 0;
for(int i = 0; i < len; i++) {
digits[i] *= 2;
digits[i] += carry;
carry = (digits[i] / pow39);
digits[i] -= carry * pow39;
}
}
void add1() {
ull carry = 1;
for(int i = 0; i < len; i++) {
digits[i] += carry;
carry = (digits[i] / pow39);
digits[i] -= carry * pow39;
if(!carry) break;
}
}
string to_tre() {
string res = "";
for(int i = 0; i < len; i++) {
ull num = digits[i];
for(int b = 0; b <= 38; b++) {
if(i * 39 + b + 1 > n) break;
res += ('0' + num % 3);
num /= 3;
}
}
reverse(all(res));
return res;
}
};
struct BitNum {
vector<ull> bits;
int n, len;
BitNum(int _n) {
len = ((n = _n) + 63) / 64;
bits.resize(len);
}
BitNum mul2() {
BitNum res(*this);
int old_bit = 0;
for(int i = 0; i < len; i++) {
int new_carry = !!(bits[i] & (ull(1) << ull(63)));
res.bits[i] = (bits[i] << 1) | old_bit;
old_bit = new_carry;
}
return res;
}
void add(BitNum const& other) {
ull carry = 0;
for(int i = 0; i < len; i++) {
ull b = bits[i];
bits[i] = bits[i] + other.bits[i] + carry;
if((carry && numeric_limits<ull>::max() - other.bits[i] <= b)
|| numeric_limits<ull>::max() - other.bits[i] < b) {
carry = 1;
}
else {
carry = 0;
}
}
}
void mul3() {
auto r = this->mul2();
r.add(*this);
this->bits = move(r.bits);
}
string to_string() {
string res = "";
for(int i = 0; i < n; i++) {
res += '0' + !!(bits[i / 64] & (ull(1) << ull(i % 64)));
}
reverse(all(res));
return res;
}
};
string tre_to_bin(int n, int m, string const& tr) {
BitNum bit(n);
BitNum off1(n); off1.bits[0] = 1;
BitNum off2(n); off2.bits[0] = 2;
for(int i = 0; i < m; i++) {
bit.mul3();
if(tr[i] == '1') bit.add(off1);
else if(tr[i] == '2') bit.add(off2);
// assert(to_bin.substr(0, len) == bi.substr(0, len));
}
return bit.to_string();
}
string bin_to_tre(int n, int m, string const& bi) {
TreNum num(m);
for(int i = 0; i < n; i++) {
num.mul2();
if(bi[i] == '1') num.add1();
}
return num.to_tre();
}
const string magic[] = {
"00110010111001000001000101001010110011100100010101001111001101000011011010001111010010110011011100000011100101000001100000110010011001011010101010101111111000110111001100110101011111011011111010101100101110101001011001001100011011001000001011110100101001110111010110011110111011111111101101100100101011010011001110101010110100111100011011011010110011100101011100111000101001001011111110111110100001001111010000100101010010010001101010111100101111001110101001101010000110001010100111000101001110110011111101110100000101100101100011110101100010101010011101000101111100010000101111100000001100101100110010011000000001101111110110011000011110111010011110100011110010111111010001101011111111111101111101110101100101101101101011011001010010010001110101000010001110001101010100111101110111011011111001110010110011100000011010000110101101110011111110110110000010110001110110010101010000111000011111110011100000000100000111110001101111001101001100001000110010011001100101000001100110101110010000110011001010100011000001110100011101100000101100010111010100000010000010010110010100000000111011100010100110111001000000010010000111101100110100101111110110111011101111010100100000110111111001101100011111001010010001000110111100000111101111010101011000100000100101010111011110110010000011010000111001010011001000101110000110101001000010100010000010011110011110101010111011010101001100101111000001100001001100001011000001011101101000111011011111100111000111011011010110001011111001001110001010011100111001001010010100100101010100011001101110101000110010100011001010010111101110101100101001001000011111000011101100110101100001110100010111100101010001001100111111010111110011000001011011101110100001110011101101001001001000111010000110001110001100110000110111001000000001111100000010000100001100011010100100100101000000110100101110011110101110000111011001000100110100111111101001101101111001111010110010010010010010111000100111101101010000111110100110100001101110001101000011100001101001101110101100001110001010100010011010001110110111010011011100000000001111010101101011100010101000110010001101110111001011101111111101010100100110101110101110001100101001000100001000001110101010010110000010100010010010100010101011111110011000001100011111010101101111010011100101111110100001100101000101101001010011110010111110010100011110010010000001011011010010101001011101101011110000010100000011101100010000110101001010101001001000010100111101100101101011010100010001011100001000000101001101110111100010101111011111101111000000100001101010101011110101001010000101111100000001101011101010101111001100001001110000100101111110110110111111100010001111010011001011110110001011110010000011001100111101100011100011110100100010011001010010001000111011100101110101110100011101111010001100111001010001010101111011001100111101111010111010001011100100001110011011101111111110011110001100100001010011101010001010011100011110111010011110111101001101001001100110101000100100010010101010111101001000110111000001010000011011110010010011001010010000101101011111011100000111110111011011000101111111011001101010011001000001000001111110011111111100011110101000001110110101110000011100111111010100100011001110110110100001101101001101001111111011001110001101000100100100011000110100000101000001000011000111011110100101100010011111011101110100100111010100100101001111000011011111100010111011010001001111111000111000000111001011011110110001001000101001111100001001110100010101101011100101010001011101100111101001110010001101000101010100110001000000110011010111100011011111010000010000011100100011110111101111011100111011000101111011110000010110111111011101101011001001100001110011001001111100011100111110111110111000111110001110110110001000111100001100010011110100110111110010101000010011110000001101010000110010010100110010101011011100001110110011110010100000001111000010010111001000010011010001000000011000011000100010010011010111011110000100011011110110100000000010111110010110000010101011111100101011101011100101010010000011011111000101111010111001000000011100111010011110110100111100010101010111001100001100101100010011100010000111100101001110111111011011100010110001111000111101010101001011101111011111000011000011100000111101011011111000111011111111101100110010111010110001000100100100101010001011101100001000101000001001110011111100010010110010111011001011001100001011111110111011111010000011000111011011110001111000010101100001111011110111010111111010110010111011000000110110001011010010111000111111011110001101001110110000101111011000010111001011010111000100101111110111000000101111111011011110100000001110011111111000110001110010000011010000111101100101001101010011111100100010111111110001110110111100001000011001100101111000111011011001000110011000010110101011011111010001001110100000000010101110001001111100010000000000101001011010100000010011100011011001010001111011111101000100011110111010110001011100100101100001110111100011000110111010001101100010011100101000010001110001010100010100000101001011001010100000101111010111101000011100110110",
"01100000110010000000001100000110010001101111000001101100101111100101101010000100000111011000100101101000110000111010001010110111110110000010001100111111011000000000010000100101011001101111000011010000111001010010110100011110100110100000100010001101000100110111100000000111101010111100011100101110001011110011100100110000110111010100100111010101000000011011011010010001100001101101101010101010011000100000111011011010111011110001110001111000110101001010000110111101100111011100111001100010101001001000011010111111000100110010010100001101111101000010101000110101101100010010101011110010011001110010010001010010101100000001011010110001011100111101001111000111111100111101110000011101100110000100111011101010010011111001110001111110100101011001011111110101011000101101010101000101111011010000111000011011101011001100001100110100000101111000011010000011111101011110100100011010100000011110101001010010010111010100000111010111101011101111010011110001001010111100010001100010110001110111011001001010100100000101110100111000101001011010100100101000010110000111010001010011101100000111110010110100100010001010010000010110011110110011110000011011101111111101101101111011000101011010101100000101000000001010110000110011100010000000011001111011110000010101010011101000010000101000111011110100011100000111110000111101001100111010100101100000110100001000100110010000101010111001011010000101001001011111010010101111001000101011001110111110010000000000001100011111110011110101001110110110101100100011010011010101011000000101000100010011001111101011100000110110010100110001001101100011000111100101100110001110100101110010001100000000000000010110000101100010000011011000010001010011011101011111100010101001000100000111011011010001011100100110001111111111101000100011111100011011101100011101001010110000001011100001011001001011100000110011110010001000001011110000010001000100001101000110100001011000100001101110001100011101001000011111111000111100010111011100001010111101111111000011101100100000101010010100001111000111100111100110101110100010100100100110111111010101001110011101001100000000101000011010111100011110100110010001010100000111000001010101111001000110000111100110000011010011110100101000111111101101001010111011001111101111100100100010101000001011010001010100100000100101101111110111111100101111100110001010001000010001011000001101011001110100110110000100111110111000100000010001010101000011110000111101000110011011001110111101001101110101111100011110011101111001001101000110100101100111001001011000111101111111111011000000101110010010101111001010001100100011011111110011010111110111100011000000110011110110111111000011011100101111000000111011001101111110111111011011110010010011110001100000110011010010110110010110001100100101001000111101100100010111001010000000001010110010001100011001111010110110111011000110001110000110001101111011111010111001101110010010001101100000011110111010111000101101101100101100111011011110001011011001100010101011101001000101001111110010101000010000110110111011100011000100110111011000010000010100111110101011111111100011100110101101011111010100000100101111001101010111100000110001100001101000000100110111111101100110000010111010001101001010101101010100001000101111001101111001100110100111111111010010100100010100010100001110101100010110110000111111101100011100100111000010110010111000111101101110100100001001101001101011010010000100010011011001100110110101110100000000111110110111101010000010001110101010011100011010100101010000010011000101101111100011101011000010101011010101111101100011101001011100011111100000110000011011011000110100101110011001101011111100011011110001100000110011110111100111000101100111010010110110100101011111001111001100000001111000010110010101100001111000001111100011011110111111100001110001011011100100010011100100011101110000001111011111001110101101000101100110010110000110110110100000000000011001111101111110110011101011010010011011101100100111110110000100110100001100101101100111011010010100110110100110010011100111111101111111110100001001100110110101110100100000000011110110110010111001010100011101010001101111010011111000001111011101011111110011000111000100110000110000101101010000111100100011101001101111100101111111010011101001101000100000011110011011011100011011110111001010011001011110101101011100111001100000010011000101110001000110100110010000101110011010011011100100011011001011010111111110001111110100100000100100011100011100111101100010001010111001001111000000101000000100110010101110011100001110011001101011111101010100101100000011010110001011000101100011111100000011010010011100110100110111110111100000111101111111100011101000100110010001110110100110010101111000011100001000001111111110001101011011111011011100011111111101000011010110101110011011111101011110111000010011110110110011111111101010100001011110100101010111101001101111101010111111011101111100101001100011010111110011111010010100011110110001000010010110111111101001011010100111000100000001001000010010110101100111011100110001000000011111110111010001101000110111110000111101"
};
void xor_with(string& b1, string const& b2) {
for(int i = 0; i < (int) b1.size(); i++) {
if(b1[i] == b2[i]) b1[i] = '0';
else b1[i] = '1';
}
}
const char MOVE_WHEN_LOSING = 'P';
const char MOVE_WHEN_WINNING = 'K';
int move_to_num(char c) {
if(c == 'P') return 0;
if(c == 'K') return 1;
if(c == 'N') return 2;
assert(0);
return 2137;
}
char winning(char c) {
if(c == 'P') return 'N';
if(c == 'K') return 'P';
if(c == 'N') return 'K';
assert(0);
return 'n';
}
string solve(int who, int n, int m) {
string bin; cin >> bin;
xor_with(bin, magic[who]);
// cerr << "magicked: " << bin << '\n';
string tre_to_send = bin_to_tre(n, m, bin);
string tre_recieved = "";
// cerr << tre_to_send << '\n';
for(int i = 0; i < m; i++) {
char move;
char d = tre_to_send[i];
move = (d == '0' ? 'P' : (d == '1' ? 'K' : 'N'));
cout << move << '\n';
cout.flush();
string response; cin >> response;
int losing = 0;
if(response[0] == winning(move)) losing = 1;
else if (winning(response[0]) == move) losing = -1;
tre_recieved += ('0' + move_to_num(response[0]));
if(losing != 0 && i != (m - 1)) {
if(losing == 1) {
// cerr << "Przegrywam, więc gram. " << MOVE_WHEN_LOSING << '\n';
move = MOVE_WHEN_LOSING;
}
else {
// cerr << "Wygrywam, więc gram. " << MOVE_WHEN_WINNING << '\n';
move = MOVE_WHEN_WINNING;
}
cout << move << '\n';
cout.flush();
losing = 0;
char resp; cin >> resp;
}
}
string res_str = tre_to_bin(n, m, tre_recieved);
// cerr << "Magicked_other: " << res_str << '\n';
xor_with(res_str, magic[who ^ 1]);
// cerr << "UNMagicked_other: " << res_str << '\n';
return res_str;
}
int main() {
string name; cin >> name;
int n, t; cin >> n >> t;
int m = int(ceil(n / log2(3) + 2));
int who = (name == "Algosia" ? 0 : 1);
for(int tc = 1; tc <= t; tc++) {
auto res = solve(who, n, m);
cout << "! " << res << '\n';
cout.flush();
}
}
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 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 | #include <bits/stdc++.h> using namespace std; #define loop(i, a, b) for(int i = a; i <= b; i++) #define loop_rev(i, a, b) for(int i = a; i >= b; i--) #define all(x) x.begin(), x.end() #define sz(x) int(x.size()) #define eb emplace_back #define pb push_back using ull = uint64_t; using ll = int64_t; struct TreNum { vector<ull> digits; int n, len; ull pow39 = 1; TreNum(int _n) { len = ((n = _n) + 38) / 39; digits.resize(len); for(int i = 1; i <= 39; i++) { pow39 *= 3; } } void mul2() { ull carry = 0; for(int i = 0; i < len; i++) { digits[i] *= 2; digits[i] += carry; carry = (digits[i] / pow39); digits[i] -= carry * pow39; } } void add1() { ull carry = 1; for(int i = 0; i < len; i++) { digits[i] += carry; carry = (digits[i] / pow39); digits[i] -= carry * pow39; if(!carry) break; } } string to_tre() { string res = ""; for(int i = 0; i < len; i++) { ull num = digits[i]; for(int b = 0; b <= 38; b++) { if(i * 39 + b + 1 > n) break; res += ('0' + num % 3); num /= 3; } } reverse(all(res)); return res; } }; struct BitNum { vector<ull> bits; int n, len; BitNum(int _n) { len = ((n = _n) + 63) / 64; bits.resize(len); } BitNum mul2() { BitNum res(*this); int old_bit = 0; for(int i = 0; i < len; i++) { int new_carry = !!(bits[i] & (ull(1) << ull(63))); res.bits[i] = (bits[i] << 1) | old_bit; old_bit = new_carry; } return res; } void add(BitNum const& other) { ull carry = 0; for(int i = 0; i < len; i++) { ull b = bits[i]; bits[i] = bits[i] + other.bits[i] + carry; if((carry && numeric_limits<ull>::max() - other.bits[i] <= b) || numeric_limits<ull>::max() - other.bits[i] < b) { carry = 1; } else { carry = 0; } } } void mul3() { auto r = this->mul2(); r.add(*this); this->bits = move(r.bits); } string to_string() { string res = ""; for(int i = 0; i < n; i++) { res += '0' + !!(bits[i / 64] & (ull(1) << ull(i % 64))); } reverse(all(res)); return res; } }; string tre_to_bin(int n, int m, string const& tr) { BitNum bit(n); BitNum off1(n); off1.bits[0] = 1; BitNum off2(n); off2.bits[0] = 2; for(int i = 0; i < m; i++) { bit.mul3(); if(tr[i] == '1') bit.add(off1); else if(tr[i] == '2') bit.add(off2); // assert(to_bin.substr(0, len) == bi.substr(0, len)); } return bit.to_string(); } string bin_to_tre(int n, int m, string const& bi) { TreNum num(m); for(int i = 0; i < n; i++) { num.mul2(); if(bi[i] == '1') num.add1(); } return num.to_tre(); } const string magic[] = { "00110010111001000001000101001010110011100100010101001111001101000011011010001111010010110011011100000011100101000001100000110010011001011010101010101111111000110111001100110101011111011011111010101100101110101001011001001100011011001000001011110100101001110111010110011110111011111111101101100100101011010011001110101010110100111100011011011010110011100101011100111000101001001011111110111110100001001111010000100101010010010001101010111100101111001110101001101010000110001010100111000101001110110011111101110100000101100101100011110101100010101010011101000101111100010000101111100000001100101100110010011000000001101111110110011000011110111010011110100011110010111111010001101011111111111101111101110101100101101101101011011001010010010001110101000010001110001101010100111101110111011011111001110010110011100000011010000110101101110011111110110110000010110001110110010101010000111000011111110011100000000100000111110001101111001101001100001000110010011001100101000001100110101110010000110011001010100011000001110100011101100000101100010111010100000010000010010110010100000000111011100010100110111001000000010010000111101100110100101111110110111011101111010100100000110111111001101100011111001010010001000110111100000111101111010101011000100000100101010111011110110010000011010000111001010011001000101110000110101001000010100010000010011110011110101010111011010101001100101111000001100001001100001011000001011101101000111011011111100111000111011011010110001011111001001110001010011100111001001010010100100101010100011001101110101000110010100011001010010111101110101100101001001000011111000011101100110101100001110100010111100101010001001100111111010111110011000001011011101110100001110011101101001001001000111010000110001110001100110000110111001000000001111100000010000100001100011010100100100101000000110100101110011110101110000111011001000100110100111111101001101101111001111010110010010010010010111000100111101101010000111110100110100001101110001101000011100001101001101110101100001110001010100010011010001110110111010011011100000000001111010101101011100010101000110010001101110111001011101111111101010100100110101110101110001100101001000100001000001110101010010110000010100010010010100010101011111110011000001100011111010101101111010011100101111110100001100101000101101001010011110010111110010100011110010010000001011011010010101001011101101011110000010100000011101100010000110101001010101001001000010100111101100101101011010100010001011100001000000101001101110111100010101111011111101111000000100001101010101011110101001010000101111100000001101011101010101111001100001001110000100101111110110110111111100010001111010011001011110110001011110010000011001100111101100011100011110100100010011001010010001000111011100101110101110100011101111010001100111001010001010101111011001100111101111010111010001011100100001110011011101111111110011110001100100001010011101010001010011100011110111010011110111101001101001001100110101000100100010010101010111101001000110111000001010000011011110010010011001010010000101101011111011100000111110111011011000101111111011001101010011001000001000001111110011111111100011110101000001110110101110000011100111111010100100011001110110110100001101101001101001111111011001110001101000100100100011000110100000101000001000011000111011110100101100010011111011101110100100111010100100101001111000011011111100010111011010001001111111000111000000111001011011110110001001000101001111100001001110100010101101011100101010001011101100111101001110010001101000101010100110001000000110011010111100011011111010000010000011100100011110111101111011100111011000101111011110000010110111111011101101011001001100001110011001001111100011100111110111110111000111110001110110110001000111100001100010011110100110111110010101000010011110000001101010000110010010100110010101011011100001110110011110010100000001111000010010111001000010011010001000000011000011000100010010011010111011110000100011011110110100000000010111110010110000010101011111100101011101011100101010010000011011111000101111010111001000000011100111010011110110100111100010101010111001100001100101100010011100010000111100101001110111111011011100010110001111000111101010101001011101111011111000011000011100000111101011011111000111011111111101100110010111010110001000100100100101010001011101100001000101000001001110011111100010010110010111011001011001100001011111110111011111010000011000111011011110001111000010101100001111011110111010111111010110010111011000000110110001011010010111000111111011110001101001110110000101111011000010111001011010111000100101111110111000000101111111011011110100000001110011111111000110001110010000011010000111101100101001101010011111100100010111111110001110110111100001000011001100101111000111011011001000110011000010110101011011111010001001110100000000010101110001001111100010000000000101001011010100000010011100011011001010001111011111101000100011110111010110001011100100101100001110111100011000110111010001101100010011100101000010001110001010100010100000101001011001010100000101111010111101000011100110110", "01100000110010000000001100000110010001101111000001101100101111100101101010000100000111011000100101101000110000111010001010110111110110000010001100111111011000000000010000100101011001101111000011010000111001010010110100011110100110100000100010001101000100110111100000000111101010111100011100101110001011110011100100110000110111010100100111010101000000011011011010010001100001101101101010101010011000100000111011011010111011110001110001111000110101001010000110111101100111011100111001100010101001001000011010111111000100110010010100001101111101000010101000110101101100010010101011110010011001110010010001010010101100000001011010110001011100111101001111000111111100111101110000011101100110000100111011101010010011111001110001111110100101011001011111110101011000101101010101000101111011010000111000011011101011001100001100110100000101111000011010000011111101011110100100011010100000011110101001010010010111010100000111010111101011101111010011110001001010111100010001100010110001110111011001001010100100000101110100111000101001011010100100101000010110000111010001010011101100000111110010110100100010001010010000010110011110110011110000011011101111111101101101111011000101011010101100000101000000001010110000110011100010000000011001111011110000010101010011101000010000101000111011110100011100000111110000111101001100111010100101100000110100001000100110010000101010111001011010000101001001011111010010101111001000101011001110111110010000000000001100011111110011110101001110110110101100100011010011010101011000000101000100010011001111101011100000110110010100110001001101100011000111100101100110001110100101110010001100000000000000010110000101100010000011011000010001010011011101011111100010101001000100000111011011010001011100100110001111111111101000100011111100011011101100011101001010110000001011100001011001001011100000110011110010001000001011110000010001000100001101000110100001011000100001101110001100011101001000011111111000111100010111011100001010111101111111000011101100100000101010010100001111000111100111100110101110100010100100100110111111010101001110011101001100000000101000011010111100011110100110010001010100000111000001010101111001000110000111100110000011010011110100101000111111101101001010111011001111101111100100100010101000001011010001010100100000100101101111110111111100101111100110001010001000010001011000001101011001110100110110000100111110111000100000010001010101000011110000111101000110011011001110111101001101110101111100011110011101111001001101000110100101100111001001011000111101111111111011000000101110010010101111001010001100100011011111110011010111110111100011000000110011110110111111000011011100101111000000111011001101111110111111011011110010010011110001100000110011010010110110010110001100100101001000111101100100010111001010000000001010110010001100011001111010110110111011000110001110000110001101111011111010111001101110010010001101100000011110111010111000101101101100101100111011011110001011011001100010101011101001000101001111110010101000010000110110111011100011000100110111011000010000010100111110101011111111100011100110101101011111010100000100101111001101010111100000110001100001101000000100110111111101100110000010111010001101001010101101010100001000101111001101111001100110100111111111010010100100010100010100001110101100010110110000111111101100011100100111000010110010111000111101101110100100001001101001101011010010000100010011011001100110110101110100000000111110110111101010000010001110101010011100011010100101010000010011000101101111100011101011000010101011010101111101100011101001011100011111100000110000011011011000110100101110011001101011111100011011110001100000110011110111100111000101100111010010110110100101011111001111001100000001111000010110010101100001111000001111100011011110111111100001110001011011100100010011100100011101110000001111011111001110101101000101100110010110000110110110100000000000011001111101111110110011101011010010011011101100100111110110000100110100001100101101100111011010010100110110100110010011100111111101111111110100001001100110110101110100100000000011110110110010111001010100011101010001101111010011111000001111011101011111110011000111000100110000110000101101010000111100100011101001101111100101111111010011101001101000100000011110011011011100011011110111001010011001011110101101011100111001100000010011000101110001000110100110010000101110011010011011100100011011001011010111111110001111110100100000100100011100011100111101100010001010111001001111000000101000000100110010101110011100001110011001101011111101010100101100000011010110001011000101100011111100000011010010011100110100110111110111100000111101111111100011101000100110010001110110100110010101111000011100001000001111111110001101011011111011011100011111111101000011010110101110011011111101011110111000010011110110110011111111101010100001011110100101010111101001101111101010111111011101111100101001100011010111110011111010010100011110110001000010010110111111101001011010100111000100000001001000010010110101100111011100110001000000011111110111010001101000110111110000111101" }; void xor_with(string& b1, string const& b2) { for(int i = 0; i < (int) b1.size(); i++) { if(b1[i] == b2[i]) b1[i] = '0'; else b1[i] = '1'; } } const char MOVE_WHEN_LOSING = 'P'; const char MOVE_WHEN_WINNING = 'K'; int move_to_num(char c) { if(c == 'P') return 0; if(c == 'K') return 1; if(c == 'N') return 2; assert(0); return 2137; } char winning(char c) { if(c == 'P') return 'N'; if(c == 'K') return 'P'; if(c == 'N') return 'K'; assert(0); return 'n'; } string solve(int who, int n, int m) { string bin; cin >> bin; xor_with(bin, magic[who]); // cerr << "magicked: " << bin << '\n'; string tre_to_send = bin_to_tre(n, m, bin); string tre_recieved = ""; // cerr << tre_to_send << '\n'; for(int i = 0; i < m; i++) { char move; char d = tre_to_send[i]; move = (d == '0' ? 'P' : (d == '1' ? 'K' : 'N')); cout << move << '\n'; cout.flush(); string response; cin >> response; int losing = 0; if(response[0] == winning(move)) losing = 1; else if (winning(response[0]) == move) losing = -1; tre_recieved += ('0' + move_to_num(response[0])); if(losing != 0 && i != (m - 1)) { if(losing == 1) { // cerr << "Przegrywam, więc gram. " << MOVE_WHEN_LOSING << '\n'; move = MOVE_WHEN_LOSING; } else { // cerr << "Wygrywam, więc gram. " << MOVE_WHEN_WINNING << '\n'; move = MOVE_WHEN_WINNING; } cout << move << '\n'; cout.flush(); losing = 0; char resp; cin >> resp; } } string res_str = tre_to_bin(n, m, tre_recieved); // cerr << "Magicked_other: " << res_str << '\n'; xor_with(res_str, magic[who ^ 1]); // cerr << "UNMagicked_other: " << res_str << '\n'; return res_str; } int main() { string name; cin >> name; int n, t; cin >> n >> t; int m = int(ceil(n / log2(3) + 2)); int who = (name == "Algosia" ? 0 : 1); for(int tc = 1; tc <= t; tc++) { auto res = solve(who, n, m); cout << "! " << res << '\n'; cout.flush(); } } |
English