Submission #1214830

#TimeUsernameProblemLanguageResultExecution timeMemory
1214830biankMessage (IOI24_message)C++20
100 / 100
375 ms856 KiB
#include <bits/stdc++.h>

using namespace std;

using vb = vector<bool>;

const int N = 1025, L = 31, Q = 66;

vb send_packet(vb A);

void send_message(vb M, vb C) {
    vector<vb> R(Q, vb(L, 0));
    M.resize(N, M.back() ^ 1);
    int k = 0;
    for (int i = 0; i < L; i++) if (C[i] == 0) {
        int c = 1;
        while (C[(i + c) % 31] == 1) c++;
        R[c - 1][i] = 1;
        for (int j = c; j < Q; j++) R[j][i] = M[k++];
    }
    for (int i = 0; i < Q; i++) send_packet(R[i]);
}

vb receive_message(vector<vb> R) {
    vector<int> f(L);
    for (int i = 0; i < L; i++) {
        int c = 1;
        for (int j = 0; j < Q; j++) {
            if (R[j][i] == 1) break;
            c++;
        }
        f[i] = (i + c) % 31;
    }
    vb M(N);
    int k = 0;
    for (int i = 0; i < L; i++) {
        bool flag = true;
        int p = i;
        for (int t = 0; t < 16; t++) {
            p = f[p], flag &= (p == i) == (t == 15);
        }
        if (!flag) continue;
        flag = false;
        for (int j = 0; j < Q; j++) {
            if (flag) M[k++] = R[j][i];
            else flag = R[j][i];
        }
    }
    bool b = M.back();
    while (M.back() == b) M.pop_back();
    return M;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...