제출 #1135504

#제출 시각아이디문제언어결과실행 시간메모리
1135504nguyentunglam메시지 (IOI24_message)C++20
0 / 100
275 ms960 KiB
#include <vector>
#include<bits/stdc++.h>
using namespace std;

std::vector<bool> send_packet(std::vector<bool> A);

mt19937 rng(1);

long long random(long long l, long long r) {
    return l + rng() % (r - l + 1);
}

int save[10010];

int p;

void init() {
    int sum = 0;
    for (int i = 0; i < 1e4; i++) sum += save[i];
    if (sum == 0) {
        for (int i = 0; i < 1e4; i++) save[i] = random(0, 1);
    }
    p = 0;
}

int get () {
    return save[p++];
}

int inv[100][40];

int T = 20;
vector<bool> _M;
void send_message(std::vector<bool> M, std::vector<bool> C) {
    init();
    int sz = M.size() - 1;
    for (int i = 0; i < 10; i++) M.insert(M.begin() + i, sz >> i & 1);

    // for (auto x : M) _M.push_back(x);

    vector<bool> hs(T); 
    for (int i = 0; i < T; i++) hs[i] = get();

    for (int i = 0; i < 100; i++) for (int j = 0; j <= 30; j++) inv[i][j] = get();

    // for (auto x : hs) cout << x << " "; cout << endl;
    int free = 0;
    for (int i = 30; i >= 0; i--) if (C[i] == 0) free = i;

    int cnt = 0, send_cnt = 0;

    for (int j = 0; j < T; j++) {
        vector<bool> query(31);
        query[free] = hs[j];
        for (int i = 0; i <= 30; i++) if (C[i] == 0 && i != free) {
            if (cnt < M.size()) query[i] = M[cnt++];
        }
        for (int i = 0; i <= 30; i++) query[i] = query[i] ^ inv[send_cnt][i];
        send_packet(query);
        send_cnt++;
    }

    // cout << free << endl;

    for (int j = free + 1; j <= 30; j++) {
        vector<bool> query(31);
        query[free] = C[j];
        for (int i = 0; i <= 30; i++) if (C[i] == 0 && i != free) {
            if (cnt < M.size()) query[i] = M[cnt++];
        }
        for (int i = 0; i <= 30; i++) query[i] = query[i] ^ inv[send_cnt][i];
        send_packet(query);
        send_cnt++;
    }
    // _M = M;

    while (cnt < M.size()) {
        vector<bool> query(31);
        for (int i = 0; i <= 30; i++) if (C[i] == 0) {
            if (cnt < M.size()) query[i] = M[cnt++];
        }
        for (int i = 0; i <= 30; i++) query[i] = query[i] ^ inv[send_cnt][i];
        send_packet(query);
        send_cnt++;
    }
}


std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
    init();

    vector<bool> hs(T); 
    for (int i = 0; i < T; i++) hs[i] = get();
    for (int i = 0; i < 100; i++) for (int j = 0; j <= 30; j++) inv[i][j] = get();

    // for (auto x : hs) cout << x << " "; cout << endl;

    int free = 0;
    for (int i = 0; i <= 30; i++) {
        vector<bool> tmp;
        for (int j = 0; j < T; j++) tmp.push_back(R[j][i] ^ inv[j][i]);
        if (hs == tmp) free = i;
    }

    vector<bool> C(31);
    for (int j = 0; j <= 30; j++) {
        C[j] = R[j + T][free] ^ inv[j + T][free];
    }

    vector<bool> ret;

    for (int j = 0; j < R.size(); j++) {
        for (int i = 0; i <= 30; i++) if (C[i] == 0) {
            if (i == free && j <= 30 + T) continue;
            ret.emplace_back(R[j][i] ^ inv[j][i]);
            // if (ret[ret.size() - 1] != _M[ret.size() - 1]) {
            //     cout << j << " " << i << " ";
            //     exit(0);
            // }
        }
    }

    int sz = 0;
    for (int i = 0; i < 10; i++) if (ret[i]) sz |= (1 << i);
    sz++;

    vector<bool> _ret;

    for (int i = 10; i < 10 + sz; i++) _ret.push_back(ret[i]);

    return _ret;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...