Submission #1317165

#TimeUsernameProblemLanguageResultExecution timeMemory
1317165spetrMessage (IOI24_message)C++20
0 / 100
350 ms808 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] == false){
                j++;
            }
        }
        packets[j-1][i] = 1;
        depth[i] = j;
    }
    ll p = 0;
    for (ll i = 0; i < 31; i++){
        for (ll j = depth[i]; j < 66; j++){
            if (C[i]){
                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, 0);
    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] == 0){
                    pointer[i] = (i+j+1)%31;
                    depth[i] = j+1;
                }
            }
        }
    }

    for (ll i = 0; i < 31; i++){if (pointer[i] == 0) pointer[i] = 1;}

    set<ll> c;
    for (ll i = 0; i < 31; i++){
        c.clear();
        ll pos = i;
        for (ll j = 0; j < 16; j++){
            c.insert(pos);
            pos = pointer[pos];
        }
        if (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; i < 1025; i++){
        if (i < m.size()) M.push_back(m[i]);
        else M.push_back(0); 
    }
    return M;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...