#include "message.h"
#include <bits/stdc++.h>
using namespace std;
using vb = vector<bool>;
using vvb = vector<vb>;
// strategy 1 (should get 10 points for S <= 64)
// send S packets. if the majority of bits in a packet are 1, then M[i] = 1. else M[i] = 0
// we have 16 (majority) of bits to ourself, so strat always works
// strategy 2 (should get 29 ish points)
// same as strat 1, except we broadcast which bits are fine and which arent
// 31 messages to inform + 65 messages to broadcast = 96 total
// M = message to send, len(M) <= 1024
// C = bitmask of tainted bits, len(C) = 31
// if C[i] = 0, then that bit is safe, otherwise that bit isnt
// 15 unsafe, 16 safe
vb mask(vb C, vb bits) {
while (bits.size() < 16) bits.push_back(false);
int idx = 0;
vb ans(31, false);
for (int i = 0; i < 31; i++) {
if (!C[i]) {
ans[i] = bits[idx];
idx++;
}
}
return ans;
}
vb decode(vb C, vb bits) {
vb M;
for (int i = 0; i < 31; i++) {
if (!C[i]) M.push_back(bits[i]);
}
return M;
}
vb int_to_vb(int inp) {
vb ans(16, false);
for (int i = 0; i < 16; i++) {
ans[i] = inp & (1 << i);
}
return ans;
}
int vb_to_int(vb inp) {
int ans = 0;
for (int i = 0; i < 16; i++) {
if (inp[i]) ans |= 1 << i;
}
return ans;
}
void send_message(vb M, vb C) {
int S = (int) M.size();
vb ZERO = vb(31, false);
vb ONE = vb(31, true);
for (int i = 0; i < 31; i++) {
if (C[i] == false) send_packet(ZERO);
else send_packet(ONE);
}
send_packet(mask(C, int_to_vb(S)));
vb cur(16, false);
for (int i = 0; i < S; i++) {
cur[i % 16] = M[i];
if ((i + 1) % 16 == 0 || i == S - 1) {
send_packet(mask(C, cur));
cur = vb(16, false);
}
}
}
vb receive_message(vvb R) {
int packets = (int) R.size();
vb safe;
vb M;
for (int i = 0; i < 31; i++) {
int ZEROS = 0; for (int j = 0; j < 31; j++) ZEROS += R[i][j] == false;
if (ZEROS >= 16) safe.push_back(false);
else safe.push_back(true);
}
int length = vb_to_int(decode(safe, R[31]));
for (int i = 32; i < packets; i++) {
vb out = decode(safe, R[i]);
for (bool el : out) {
M.push_back(el);
}
}
vb nM;
for (int i = 0; i < length; i++) nM.push_back(M[i]);
return nM;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |