제출 #1205802

#제출 시각아이디문제언어결과실행 시간메모리
1205802AndreyMessage (IOI24_message)C++20
69.71 / 100
424 ms872 KiB
#include "message.h"
#include<bits/stdc++.h>
using namespace std;

int calc(vector<bool> c, int p) {
    if(c[p] == 1) {
        return INT_MAX;
    }
    vector<bool> d(0);
    for(int i = p; i < 31; i++) {
        d.push_back(c[i]);
    }
    for(int i = 0; i < p; i++) {
        d.push_back(c[i]);
    }
    int br = 0,y = 1;
    while(y < 31) {
        for(int i = 0; i < min(31,y); i++) {
            if(d[i] == 0) {
                y++;
            }
        }
        br++;
    }
    return br;
}

void send_message(std::vector<bool> m, std::vector<bool> c) {
    int sm = INT_MAX,p = -1;
    for(int i = 0; i < 31; i+=2) {
        int x = calc(c,i);
        if(x < sm) {
            sm = x;
            p = i;
        }
    }
    for(int i = 1; i < 5; i++) {
        vector<bool> wut(31);
        if((1 << i)&p) {
            for(int j = 0; j < 31; j++) {
                wut[j] = 1;
            }
        }
        send_packet(wut);
    }
    int y = 1;
    while(y < 31) {
        int x = p+y;
        vector<bool> wut(31);
        for(int i = p; i < p+min(31,y); i++) {
            if(c[i%31] == 0) {
                y++;
                wut[i%31] = c[x%31];
                x++;
            }
        }
        send_packet(wut);
    }
    for(int i = 0; i < (m.size()+15)/16; i++) {
        int y = i*16;
        vector<bool> wut(31);
        for(int j = 0; j < 31; j++) {
            if(c[j] == 0 && y < m.size()) {
                wut[j] = m[y];
                y++;
            }
        }
        send_packet(wut);
    }
    y = 0;
    vector<bool> wut(31);
    for(int i = 0; i < 31; i++) {
        if(c[i] == 0 && y < 4 && (((1 << y)&((int)m.size())) > 0)) {
            wut[i] = 1;
            y++;
        }
        else if(c[i] == 0) {
            y++;
        }
    }
    send_packet(wut);
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> r) {
    int p = 0;
    for(int i = 0; i < 4; i++) {
        int br = 0;
        for(int j = 0; j < 31; j++) {
            if(r[i][j]) {
                br++;
            }
        }
        if(br >= 16) {
            p+=(1 << (i+1));
        }
    }
    int y = 1;
    int x = 4;
    vector<bool> wow(1,false);
    while(wow.size() < 31) {
        for(int j = 0; j < min((int)wow.size(),31); j++) {
            if(wow[j] == false) {
                wow.push_back(r[x][(j+p)%31]);
            }
        }
        x++;
    }
    vector<bool> c(31);
    for(int i = 0; i < 31; i++) {
        c[i] = wow[(i-p+31)%31];
    }
    vector<bool> m(0);
    for(int i = x; i < r.size()-1; i++) {
        for(int j = 0; j < 31; j++) {
            if(c[j] == 0) {
                m.push_back(r[i][j]);
            }
        }
    }
    int z = 0;
    y = 0;
    for(int i = 0; i < 31; i++) {
        if(c[i] == 0 && y < 4) {
            if(r[r.size()-1][i]) {
                z+=(1 << y);
            }
            y++;
        }
    }
    while(m.size()%16 != z) {
        m.pop_back();
    }
    return m;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...