Submission #1317166

#TimeUsernameProblemLanguageResultExecution timeMemory
1317166spetrMessage (IOI24_message)C++20
0 / 100
348 ms812 KiB
#include <bits/stdc++.h>
#include "message.h"
using namespace std;

#define ll long long
const ll mmod = 998244353;
#define vl vector<long long>
#define vll vector<vector<long long>>
#define pl pair<long long, long long>
#define vb vector<bool>

void send_message(std::vector<bool> M, std::vector<bool> C){
    reverse(M.begin(), M.end());
    M.push_back(1);
    while (M.size() < 1025){
        M.push_back(0);
    }
    reverse(M.begin(), M.end());
    vector<vector<bool>> packets(66, vector<bool> (31, 0));

    vl depth(31, 0);
    for (ll i = 0; i < 31; i++){
        ll j = 1;
        if (!C[i]){ 
            while (C[(i+j)%31] == true){
                j++;
            }
            packets[j-1][i] = 1;
            depth[i] = j;
        }
    }
    ll p = 0;
    for (ll i = 0; i < 31; i++){
        if (!C[i]){
            for (ll j = depth[i]; j < 66; j++){
                if (p < M.size()) {
                    packets[j][i] = M[p];
                    p++;
                }
            }
        }
    }

    for (ll i = 0; i < 66; i++){
        send_packet(packets[i]);
    }
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> R){
    vl pointer(31, -1);
    vl depth(31, 0);
    for (ll i = 0; i < 31; i++){
        for (ll j = 0; j < 66; j++){
            if (R[j][i]){
                if (pointer[i] == -1){
                    pointer[i] = (i+j+1)%31;
                    depth[i] = j+1;
                }
            }
        }
    }

    set<ll> c;
    for (ll i = 0; i < 31; i++){
        if (pointer[i] == -1) continue;
        c.clear();
        ll pos = i;
        bool ok = true;
        for (ll j = 0; j < 16; j++){
            c.insert(pos);
            if (pointer[pos] == -1) { ok = false; break; }
            pos = pointer[pos];
        }
        if (ok && pointer[pos] == i && c.size() == 16){
            break;
        }
    }

    vector<bool> m;
    for (auto x: c){
        for (ll i = depth[x]; i < 66; i++){
            m.push_back(R[i][x]);
        }
    }
    vector<bool> M;
    ll p = 0;
    while (p < m.size() && m[p] == 0){
        p++;
    }
    p++;
    for (ll i = p; M.size() < 1025 && i < m.size(); i++){
        M.push_back(m[i]);
    }
    if (M.size() < 1025) M.resize(1025, 0);
    return M;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...