Submission #1267383

#TimeUsernameProblemLanguageResultExecution timeMemory
1267383alphabeastmamMessage (IOI24_message)C++17
10 / 100
514 ms844 KiB
#include <bits/stdc++.h>
using namespace std;

/*
   The grader provides send_packet() in the sender program.
   On the receiver side, only receive_message() is called.
*/

// ================= SENDER SIDE =================

// This will be provided by the grader in the sender program.
// We declare it here so the code compiles.
extern vector<bool> send_packet(vector<bool> A);

// Encode message length S (<= 1024) into 10 bits, MSB first.
static vector<bool> encode_len10(int S) {
    vector<bool> bits(10, false);
    for (int i = 9; i >= 0; --i) {
        bits[9 - i] = ((S >> i) & 1);
    }
    return bits;
}

void send_message(vector<bool> M, vector<bool> C) {
    // Build mask G of reliable indices: 1 = reliable, 0 = controlled
    vector<bool> G(31, false);
    for (int i = 0; i < 31; ++i) G[i] = !C[i];

    // === Phase 1: Send 31 cyclic shifts of G ===
    for (int t = 0; t < 31; ++t) {
        vector<bool> A(31, false);
        for (int i = 0; i < 31; ++i) {
            int p = (i + t) % 31;
            A[p] = G[i];
        }
        (void)send_packet(A); // Cleopatra taints, but we ignore here
    }

    // Reliable indices in ascending order
    vector<int> reliable;
    for (int i = 0; i < 31; ++i) if (G[i]) reliable.push_back(i);

    // Payload: 10-bit header + message bits
    vector<bool> payload = encode_len10((int)M.size());
    payload.insert(payload.end(), M.begin(), M.end());

    // === Phase 2: Send payload, 16 bits per packet ===
    size_t pos = 0;
    while (pos < payload.size()) {
        vector<bool> A(31, false);
        for (int j = 0; j < (int)reliable.size(); ++j) {
            if (pos < payload.size()) {
                A[reliable[j]] = payload[pos++];
            }
        }
        (void)send_packet(A);
    }
}

// ================= RECEIVER SIDE =================

// Helper: strict majority from 31 packets
static bool majority31(const array<int,31>& ones, int i) {
    return ones[i] > 15; // must be >=16 to win
}

vector<bool> receive_message(vector<vector<bool>> R) {
    int P = (int)R.size();

    // === Phase 1: reconstruct G ===
    array<int,31> ones{}; ones.fill(0);
    for (int t = 0; t < 31; ++t) {
        for (int i = 0; i < 31; ++i) {
            int phys = (i + t) % 31;
            if (R[t][phys]) ++ones[i];
        }
    }
    vector<bool> G(31, false);
    for (int i = 0; i < 31; ++i) {
        G[i] = (ones[i] > 15);
    }

    // Reliable indices in ascending order
    vector<int> reliable;
    for (int i = 0; i < 31; ++i) if (G[i]) reliable.push_back(i);

    // === Phase 2: parse payload ===
    vector<bool> bitstream;
    for (int t = 31; t < P; ++t) {
        for (int idx : reliable) {
            bitstream.push_back(R[t][idx]);
        }
    }

    if (bitstream.size() < 10) return {}; // defensive guard

    // First 10 bits = length
    int S = 0;
    for (int i = 0; i < 10; ++i) {
        S = (S << 1) | (bitstream[i] ? 1 : 0);
    }

    // Next S bits = message
    vector<bool> M;
    M.reserve(S);
    for (int i = 10; i < 10 + S && i < (int)bitstream.size(); ++i) {
        M.push_back(bitstream[i]);
    }
    return M;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...