#include <bits/stdc++.h>
using namespace std;
vector<bool> safeWrite(vector<bool> const& a, vector<bool> const& c) {
vector<bool> res(31);
size_t p = 0;
for (size_t i = 0; i < 31; ++i) res[i] = (!c[i] ? a[p++] : 0);
return res;
}
vector<bool> safeRead(vector<bool> const& a, vector<bool> const& c) {
vector<bool> res;
for (size_t i = 0; i < 31; ++i)
if (!c[i]) res.emplace_back(a[i]);
return res;
}
vector<bool> send_packet(vector<bool> A);
void send_message(vector<bool> a, vector<bool> c) {
vector<size_t> poses;
for (size_t i = 0; i < 31; ++i)
if (!c[i]) poses.emplace_back(i);
for (size_t i = 0; i < 4; ++i)
send_packet(vector<bool>(31, (poses[0] >> i) & 1));
for (size_t i = 0; i < 4; ++i) {
vector<bool> dat(16);
for (size_t j = 1; j < 16; ++j)
dat[j - 1] = ((poses[j] - poses[j - 1] - 1) >> i) & 1;
dat[15] = ((a.size() % 16) >> i) & 1;
send_packet(safeWrite(dat, c));
}
vector<bool>::iterator it = a.begin(), jt = it + 16;
for (; jt < a.end(); it += 16, jt += 16)
send_packet(safeWrite(vector<bool>(it, jt), c));
{
vector<bool> lst(it, a.end());
lst.resize(16);
send_packet(safeWrite(lst, c));
}
}
std::vector<bool> receive_message(std::vector<std::vector<bool>> r) {
reverse(r.begin(), r.end());
size_t rev = 0;
vector<size_t> poses(16);
for (size_t j = 0; j < 4; ++j) {
poses[0] |= unsigned(count(r.back().begin(), r.back().end(), true) >= 16)
<< j;
r.pop_back();
}
for (size_t i = 1; i < 16; ++i) {
for (size_t j = 0; j < 4; ++j)
poses[i] |= unsigned(r.rbegin()[j][poses[i - 1]]) << j;
poses[i] += poses[i - 1] + 1;
}
for (size_t j = 0; j < 4; ++j) rev |= unsigned(r.rbegin()[j][poses[15]]) << j;
if (rev == 0) rev = 16;
r.erase(r.end() - 4, r.end());
vector<bool> c(31, true);
for (size_t i : poses) c[i] = false;
vector<bool> ans;
while (r.size() > 1) {
vector<bool> h = safeRead(r.back(), c);
ans.insert(ans.end(), h.begin(), h.end());
r.pop_back();
}
{
vector<bool> h = safeRead(r.back(), c);
ans.insert(ans.end(), h.begin(), h.begin() + rev);
}
return ans;
}
#ifndef ONLINE_JUDGE
vector<vector<bool>> packets;
vector<bool> d(31);
mt19937 rd((random_device())());
uniform_int_distribution<unsigned short int> rdb(0, 1);
vector<bool> send_packet(vector<bool> A) {
assert(A.size() == 31);
for (size_t i = 0; i < 31; ++i)
if (d[i]) A[i] = rdb(rd);
packets.emplace_back(A);
return A;
}
int main(void) {
size_t n;
cin >> n;
vector<bool> dat(n);
for (auto i : dat) {
char c;
cin >> c;
i = c == '1';
}
for (auto i : d) {
char c;
cin >> c;
i = c == '1';
}
send_message(dat, d);
vector<bool> res = receive_message(packets);
assert(res == dat);
cerr << packets.size();
}
#endif