#include "message.h"
#include <bits/stdc++.h>
using namespace std;
int o[31] = {27, 4, 14, 22, 13, 28, 21, 1, 25, 6, 8, 24, 16, 5, 2, 19, 30, 29, 23, 10, 26, 17, 3, 11, 9, 15, 18, 20, 12, 7, 0};
void send_message(vector<bool> M, vector<bool> C)
{
int n = M.size();
vector<vector<bool>> res;
vector<int> unlock;
for (int i = 0; i < 31;)
{
vector<bool> v;
if (unlock.empty())
{
if (C[o[i]] == 0) v = vector<bool>(31, 1);
else v = vector<bool>(31, 0);
send_packet(v);
if (v.back()) unlock.push_back(o[i]);
i++;
continue;
}
v = vector<bool>(31, 0);
int j = 0;
while (i < 31 && j < unlock.size())
{
if (C[o[i]] == 0) v[unlock[j]] = 1, unlock.push_back(o[i]);
else v[unlock[j]] = 0;
i++, j++;
}
send_packet(v);
}
{
vector<bool> v(31, 0);
for (int i = 0; i < 10; i++) v[unlock[i]] = (n >> i & 1);
send_packet(v);
}
for (int i = 0; i < (n + 15) / 16; i++)
{
vector<bool> v(31, 0);
for (int j = 0; j < 16; j++)
{
if (i * 16 + j >= n) break;
v[unlock[j]] = M[i * 16 + j];
}
send_packet(v);
}
}
vector<bool> receive_message(vector<vector<bool>> R)
{
vector<int> unlock;
int cur = -1;
auto nxt = [&]()
{
return R[++cur];
};
auto get = [&](vector<bool> A)
{
int cnt = 0;
for (auto i : A) cnt += (int)i;
return cnt >= 16;
};
for (int i = 0; i < 31;)
{
vector<bool> v = nxt();
if (unlock.empty())
{
if (get(v)) unlock.push_back(o[i]);
i++;
continue;
}
int j = 0;
while (i < 31 && j < unlock.size())
{
if (v[unlock[j]] == 1) unlock.push_back(o[i]);
i++, j++;
}
}
vector<bool> sz = nxt();
int n = 0;
for (int i = 0; i < 10; i++)
{
if (sz[unlock[i]]) n |= (1 << i);
}
vector<bool> res(n, 0);
for (int i = 0; i < (n + 15) / 16; i++)
{
vector<bool> v = nxt();
for (int j = 0; j < 16; j++)
{
if (i * 16 + j >= n) break;
res[i * 16 + j] = v[unlock[j]];
}
}
return res;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |