#include "message.h"
#include <bits/stdc++.h>
using namespace std;
using vb = vector<bool>;
using vvb = vector<vb>;
void send_message(vb M, vb C) {
vector<int> bits; for (int i = 0; i < 31; i++) if (!C[i]) bits.push_back(i);
for (int i = 0; i < 4; i++) {
vb to_send(31);
for (int bit = 0; bit < 16; bit++) {
int nxt = bit == 15 ? 0 : bit + 1;
to_send[bits[bit]] = ((bits[nxt] - bits[bit] + 30) % 31) & (1 << i);
}
send_packet(to_send);
}
int cidx = 0;
for (int i = 4; i < 69; i++) {
vb packet(31);
for (int j = 0; j < 16; j++) {
if (cidx == M.size()) packet[bits[j]] = 1;
else if (cidx > M.size()) packet[bits[j]] = 0;
else packet[bits[j]] = M[cidx];
cidx++;
}
send_packet(packet);
}
}
vb receive_message(vvb R) {
vector<int> nxt(31, 0);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 31; j++) {
nxt[j] |= (R[i][j] << i);
}
}
for (int i = 0; i < 31; i++) {
nxt[i] = (i + nxt[i] + 1) % 31;
}
vector<int> bits;
for (int i = 0; i < 31; i++) {
int cur = i; vector<int> trial;
while (trial.size() < 16 && !count(trial.begin(), trial.end(), cur) && cur != 31) {
trial.push_back(cur);
cur = nxt[cur];
}
if (trial.size() == 16 && nxt[trial.back()] == i) {
bits = trial; break;
}
}
vb ans;
for (int i = 4; i < R.size(); i++) {
for (int j = 0; j < 16; j++) {
ans.push_back(R[i][bits[j]]);
}
}
while (!ans.back()) ans.pop_back();
ans.pop_back();
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |