제출 #1216277

#제출 시각아이디문제언어결과실행 시간메모리
1216277shmax메시지 (IOI24_message)C++20
100 / 100
412 ms860 KiB
#include <bits/stdc++.h>
#include "message.h"

using namespace std;

template<typename T>
using vec = vector<T>;

void send_message(std::vector<bool> M, std::vector<bool> C) {

    reverse(M.begin(), M.end());
    M.push_back(true);
    while (M.size() < 1025) M.push_back(false);
    reverse(M.begin(), M.end());
    vec<int> next(31, 0);
    int last = -1;
    for (int i = 0; i < 31; i++) {
        if (C[i] == 0) {
            last = i;
            break;
        }
    }
    for (int i = 30; i >= 0; i--) {
        if (C[i] == 0) {
            next[i] = last;
            last = i;
        }
    }
    for (int i = 0; i < 31; i++) {
        int diff = next[i] - i;
        if (diff < 0) diff += 31;
        next[i] = diff;
    }
    vec<int> good;
    for (int i = 0; i < 31; i++) {
        if (C[i] == 0)
            good.push_back(i);
    }

    vec<vec<bool>> R(66, vec<bool>(31, false));
    int ptr = 0;
    for (int i: good) {
        for (int j = 0; j < next[i] - 1; j++)
            R[j][i] = false;
        R[next[i] - 1][i] = true;
        for (int j = next[i]; j < 66; j++) {
            R[j][i] = M[ptr++];
        }
    }
    for (const auto &row: R)
        send_packet(row);


//    for (int i = 0; i < 4; i++) {
//        vec<bool> d(31, false);
//        for (int j = 0; j < 31; j++) {
//            d[j] = (next[j] >> i) & 1;
//        }
//        send_packet(d);
//    }

//    vec<bool> d(31, false);
//    for (int j = 0; j < 16; j++) {
//        d[good[j]] = (M.size() >> j) & 1;
//    }
//    send_packet(d);
//    while (M.size() % 16 != 0) {
//        M.push_back(false);
//    }
//    for (int i = 0; i < M.size(); i += 16) {
//        for (int j = 0; j < 16; j++) {
//            d[good[j]] = M[i + j];
//        }
//        send_packet(d);
//    }
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
    vec<int> next(31, 0);
    vec<int> st(31, 0);
    for (int i = 0; i < 31; i++) {
        int cnt = 0;
        while (!R[cnt][i] and cnt < 31) cnt++;
        cnt++;
        st[i] = cnt;
        next[i] = i + cnt;
        next[i] %= 31;
    }
    vec<int> good;
    for (int start = 0; start < 31; start++) {
        vec<int> cur;
        int pos = start;
        cur.push_back(pos);
        pos = next[pos];
        if (pos >= 31) continue;
        set<int> seen;
        while (pos != start) {
            if (pos >= 31) break;
            if (seen.count(pos)) break;
            seen.insert(pos);
            cur.push_back(pos);
            pos = next[pos];
        }
        if (pos != start) continue;
        if (cur.size() != 16) continue;
        good = cur;
        break;
    }
    sort(good.begin(), good.end());
    vec<bool> M;
    for (int i: good) {
        for (int j = st[i]; j < 66; j++)
            M.push_back(R[j][i]);
    }
    reverse(M.begin(), M.end());
    while (!M.back()) M.pop_back();
    M.pop_back();
    reverse(M.begin(), M.end());
    return M;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...