#include <vector>
#include<bits/stdc++.h>
using namespace std;
std::vector<bool> send_packet(std::vector<bool> A);
mt19937 rng(1);
long long random(long long l, long long r) {
return l + rng() % (r - l + 1);
}
int save[10010];
int p;
void init() {
int sum = 0;
for (int i = 0; i < 1e4; i++) sum += save[i];
if (sum == 0) {
for (int i = 0; i < 1e4; i++) save[i] = random(0, 1);
}
p = 0;
}
int get () {
return save[p++];
}
int inv[100][40];
int T = 20;
vector<bool> _M;
void send_message(std::vector<bool> M, std::vector<bool> C) {
init();
int sz = M.size() - 1;
for (int i = 0; i < 10; i++) M.insert(M.begin() + i, sz >> i & 1);
// for (auto x : M) _M.push_back(x);
vector<bool> hs(T);
for (int i = 0; i < T; i++) hs[i] = get();
for (int i = 0; i < 100; i++) for (int j = 0; j <= 30; j++) inv[i][j] = get();
// for (auto x : hs) cout << x << " "; cout << endl;
int free = 0;
for (int i = 30; i >= 0; i--) if (C[i] == 0) free = i;
int cnt = 0, send_cnt = 0;
for (int j = 0; j < T; j++) {
vector<bool> query(31);
query[free] = hs[j];
for (int i = 0; i <= 30; i++) if (C[i] == 0 && i != free) {
if (cnt < M.size()) query[i] = M[cnt++];
}
for (int i = 0; i <= 30; i++) query[i] = query[i] ^ inv[send_cnt][i];
send_packet(query);
send_cnt++;
}
// cout << free << endl;
for (int j = free + 1; j <= 30; j++) {
vector<bool> query(31);
query[free] = C[j];
for (int i = 0; i <= 30; i++) if (C[i] == 0 && i != free) {
if (cnt < M.size()) query[i] = M[cnt++];
}
for (int i = 0; i <= 30; i++) query[i] = query[i] ^ inv[send_cnt][i];
send_packet(query);
send_cnt++;
}
// _M = M;
while (cnt < M.size()) {
vector<bool> query(31);
for (int i = 0; i <= 30; i++) if (C[i] == 0) {
if (cnt < M.size()) query[i] = M[cnt++];
}
for (int i = 0; i <= 30; i++) query[i] = query[i] ^ inv[send_cnt][i];
send_packet(query);
send_cnt++;
}
}
std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
init();
vector<bool> hs(T);
for (int i = 0; i < T; i++) hs[i] = get();
for (int i = 0; i < 100; i++) for (int j = 0; j <= 30; j++) inv[i][j] = get();
// for (auto x : hs) cout << x << " "; cout << endl;
int free = 0;
for (int i = 0; i <= 30; i++) {
vector<bool> tmp;
for (int j = 0; j < T; j++) tmp.push_back(R[j][i] ^ inv[j][i]);
if (hs == tmp) free = i;
}
vector<bool> C(31);
for (int j = 0; j <= 30; j++) {
C[j] = R[j + T][free] ^ inv[j + T][free];
}
vector<bool> ret;
for (int j = 0; j < R.size(); j++) {
for (int i = 0; i <= 30; i++) if (C[i] == 0) {
if (i == free && j <= 30 + T) continue;
ret.emplace_back(R[j][i] ^ inv[j][i]);
// if (ret[ret.size() - 1] != _M[ret.size() - 1]) {
// cout << j << " " << i << " ";
// exit(0);
// }
}
}
int sz = 0;
for (int i = 0; i < 10; i++) if (ret[i]) sz |= (1 << i);
sz++;
vector<bool> _ret;
for (int i = 10; i < 10 + sz; i++) _ret.push_back(ret[i]);
return _ret;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |