제출 #1334788

#제출 시각아이디문제언어결과실행 시간메모리
1334788danglayloi1메시지 (IOI24_message)C++20
0 / 100
113 ms828 KiB
// #define dak
#ifndef dak
#include "message.h"
#endif
#include <bits/stdc++.h>
using namespace std;
#ifdef dak
void send_packet(vector<bool> s)
{

}
#endif
vector<int> base={1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768};
void send_message(vector<bool> M, vector<bool> C)
{
    vector<bool> ve;
    for(int i = 0; i < base.size(); i++)
    {
        ve.clear();
        int bit=0;
        for(int j = 0; j < 31; j++)
        {
            if(C[j]==0)
            {
                ve.emplace_back((base[i]>>bit&1));
                bit++;
            }
            else ve.emplace_back(0);
        }
        send_packet(ve);
    }
    int len=M.size();
    int bit=0;
    ve.clear();
    for(int i = 0; i < 31; i++)
    {
        if(C[i]==0) ve.emplace_back((len>>bit&1)), bit++;
        else ve.emplace_back(0);
    }
    send_packet(ve);
    int sus=len/16*16;
    if(len%16!=0) sus+=16;
    while(M.size()<sus) M.emplace_back(0);
    int p=0;
    for(int i = 0; i < sus; i+=16)
    {
        ve.clear();
        for(int j = 0; j < 31; j++)
        {
            if(C[j]==0) ve.emplace_back(M[p++]);
            else ve.emplace_back(0);
        }
        send_packet(ve);
    }
}

vector<bool> receive_message(vector<vector<bool>> R)
{
    int poi=base.size();
    vector<bool> C(31, true);
    vector<bool> res={};
    vector<vector<int>> can(31, vector<int>{});
    vector<int> rem={};
    int cur=0;
    for(int i = 0; i < 31; i++)
    {
        if(cur==16) break;
        bool ok=1;
        for(int k = 0; k < base.size(); k++)
        {
            if(R[k][i]!=(base[k]>>cur&1))
            {
                ok=0;
                break;
            }
        }
        if(ok) rem.emplace_back(i), cur++;
    }
    for(int x:rem) C[x]=0;
    int len=0, bit=0;
    for(int i = 0; i < 31; i++)
    {
        if(C[i]==0)
        {
            len+=(1<<bit)*R[poi][i];
            bit++;
        }
    }
    poi++;
    for(int i = poi; i < R.size(); i++)
    {
        for(int j = 0; j < 31; j++)
        {
            if(C[j]==0) res.emplace_back(R[i][j]);
        }
    }
    while(res.size()>len) res.pop_back();
    return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...