Submission #1344364

#TimeUsernameProblemLanguageResultExecution timeMemory
1344364SulAMessage (IOI24_message)C++20
100 / 100
418 ms836 KiB
#include "message.h"
#include <bits/stdc++.h>
#define all(a) (a).begin(), (a).end()
#define popcount(x) __builtin_popcountll(x)
using namespace std;

void send_message(vector<bool> message, vector<bool> C) {
    message.push_back(1);
    while (message.size() < 1025)
        message.push_back(0);

    vector<int> mine;
    int jump[31];
    for (int i = 0; i < 31; i++)
        if (C[i] == 0)
            mine.push_back(i);
    for (int i = 0; i < 16; i++) {
        jump[mine[i]] = (mine[(i + 1) % 16] - mine[i] + 31) % 31;
    }

    int ptr = 0;
    for (int i = 0; i < 66; i++) {
        vector<bool> packet(31);
        for (int j = 0; j < 31; j++) {
            if (C[j]) continue;
            if (i < jump[j] - 1)
                packet[j] = 0;
            else if (i == jump[j] - 1)
                packet[j] = 1;
            else
                packet[j] = message[ptr++];
        }
        send_packet(packet);
    }
}

vector<bool> receive_message(vector<vector<bool>> packets) {
    int jump[31];
    for (int j = 0; j < 31; j++) {
        int i = 0;
        while (i < 66 && packets[i][j] == 0)
            i++;
        jump[j] = i+1;
    }
//    return {};
    vector<bool> C(31, 1);
    for (int j = 0; j < 31; j++) {
        set<int> nodes;
        int cur = j;
        for (int iter = 0; iter < 16; iter++) {
            nodes.insert(cur);
            cur = (cur + jump[cur]) % 31;
        }
        if (cur == j && nodes.size() == 16)
            C[j] = 0;
    }
    vector<bool> message;
    for (int i = 0; i < 66; i++) {
        for (int j = 0; j < 31; j++) {
            if (C[j]) continue;
            if (jump[j] <= i)
                message.push_back(packets[i][j]);
        }
    }
//    assert(message.size() == 1025);
    int x = 0;
    while (x == 0) {
        x = message.back();
        message.pop_back();
    }
    return message;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...