Submission #1315332

#TimeUsernameProblemLanguageResultExecution timeMemory
1315332ezzzayMessage (IOI24_message)C++17
0 / 100
378 ms808 KiB
#include "message.h"
#include <bits/stdc++.h>
using namespace std;

static vector<bool> toBoolVec(const vector<int>& v){
    vector<bool> r(v.size());
    for(size_t i=0;i<v.size();++i) r[i] = (v[i] != 0);
    return r;
}

void send_message(vector<bool> M_bool, vector<bool> C_bool) {
    vector<int> M;
    for(bool b : M_bool) M.push_back(b ? 1 : 0);
    vector<int> C(31);
    for(int i=0;i<31;i++) C[i] = C_bool[i] ? 1 : 0;

    int x = -1;
    for(int i=0;i<31;i++) if(C[i] == 0) { x = i; break; }
    if(x == -1) x = 0;
    x &= 31;

    for(int i=0;i<5;i++){
        int bit = (x >> i) & 1;
        vector<int> v(31, bit);
        send_packet(toBoolVec(v));
    }

    vector<int> msg;
    int S = (int)M.size();
    int z = 1025 - S - 1;
    for(int i=0;i<z;i++) msg.push_back(0);
    msg.push_back(1);
    for(int b : M) msg.push_back(b);

    vector<int> safeIdx;
    for(int j=0;j<31;j++) if(C[j] == 0 && j != x) safeIdx.push_back(j);

    int ptr = 0;

    for(int i=0;i<31;i++){
        vector<int> v(31, 0);
        v[x] = C[i];
        for(int s = 0; s < (int)safeIdx.size() && ptr < (int)msg.size(); ++s){
            int j = safeIdx[s];
            v[j] = msg[ptr++];
        }
        send_packet(toBoolVec(v));
    }

    while(ptr < (int)msg.size()){
        vector<int> v(31, 0);
        v[x] = 0;
        for(int s = 0; s < (int)safeIdx.size() && ptr < (int)msg.size(); ++s){
            int j = safeIdx[s];
            v[j] = msg[ptr++];
        }
        send_packet(toBoolVec(v));
    }
}

vector<bool> receive_message(vector<vector<bool>> Rb) {
    int P = (int)Rb.size();
    if(P == 0) return {};
    vector<vector<int>> R(P, vector<int>(31,0));
    for(int i=0;i<P;i++) for(int j=0;j<31 && j<(int)Rb[i].size(); ++j) R[i][j] = Rb[i][j] ? 1 : 0;

    if(P < 5) return {};

    int x = 0;
    for(int i=0;i<5;i++){
        int ones = 0;
        for(int j=0;j<31;j++) ones += R[i][j];
        if(ones >= 16) x |= (1<<i);
    }
    x &= 31;
    if(x < 0 || x >= 31) x = x % 31;

    vector<int> C(31,1);
    if(P >= 5 + 31){
        for(int i=0;i<31;i++){
            C[i] = R[5 + i][x];
        }
    } else {
        int available = max(0, P - 5);
        for(int i=0;i<available && i<31;i++) C[i] = R[5 + i][x];
        for(int i=available;i<31;i++) C[i] = 1;
    }

    vector<int> safeIdx;
    for(int j=0;j<31;j++) if(C[j] == 0 && j != x) safeIdx.push_back(j);

    vector<int> msg;
    for(int i=5;i<P;i++){
        for(int s=0;s<(int)safeIdx.size(); ++s){
            int j = safeIdx[s];
            msg.push_back(R[i][j]);
        }
    }

    int pos = 0;
    while(pos < (int)msg.size() && msg[pos] == 0) pos++;
    if(pos >= (int)msg.size()) return {};
    pos++;

    vector<bool> M;
    for(int i=pos;i<(int)msg.size(); ++i) M.push_back(msg[i] ? true : false);
    return M;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...