# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1221525 | nibert | Message (IOI24_message) | C++17 | 0 ms | 0 KiB |
#include <vector>
using namespace std;
// Provided by judge
extern vector<bool> send_packet(vector<bool> pkt);
extern vector<vector<bool>> receive_packets();
// Generator matrix for (31,16) code — rows are 16 vectors of length 31
static const unsigned int GEN[16] = {
0x7FFE0000u, 0x3FFF0000u, 0x1FFF8000u, 0x0FFFc000u,
0x07FFE000u, 0x03FFF000u, 0x01FFF800u, 0x00FFFc00u,
0x007FFE00u, 0x003FFF00u, 0x001FFF80u, 0x000FFFc0u,
0x0007FFE0u, 0x0003FFF0u, 0x0001FFF8u, 0x0000FFFcu
};
void send_message(vector<bool> M, vector<bool> C_unused) {
int L = M.size();
int blocks = (L + 15) / 16;
for (int b = 0; b < blocks; ++b) {
uint32_t word = 0;
for (int i = 0; i < 16; ++i) {
int idx = b * 16 + i;
word |= (idx < L && M[idx]) ? (1u << i) : 0u;
}
vector<bool> pkt(31);
for (int i = 0; i < 31; ++i) {
int bit = 0;
for (int j = 0; j < 16; ++j) {
if ((word >> j) & 1u) bit ^= (GEN[j] >> i) & 1u;
}
pkt[i] = bit;
}
send_packet(pkt);
}
}
vector<bool> receive_message(vector<vector<bool>> R) {
int blocks = R.size();
vector<bool> out;
out.reserve(blocks * 16);
for (auto &pkt : R) {
uint32_t word = 0;
for (int bit = 0; bit < 16; ++bit) {
int val = 0;
for (int i = 0; i < 31; ++i) {
if ((GEN[bit] >> i) & 1u) val ^= pkt[i];
}
word |= (val & 1) << bit;
}
for (int i = 0; i < 16; ++i)
out.push_back((word >> i) & 1);
}
return out;
}