Submission #1363401

#TimeUsernameProblemLanguageResultExecution timeMemory
1363401activedeltorreMessage (IOI24_message)C++20
100 / 100
273 ms836 KiB
#include "message.h"
#include <cassert>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
std::vector<bool> send_packet(std::vector<bool> A);
vector<vector<bool>>mat;
int nxt[66];
void send_message(std::vector<bool> M, std::vector<bool> C)
{
    M.push_back(1);
    while(M.size()<1025)
    {
        M.push_back(0);
    }
    vector<int>biti;
    mat.resize(66);
    for(int i=0;i<66;i++)
    {
        mat[i].resize(31);
        for(int j=0;j<=31;j++)
        {
            mat[i][j]=0;
        }
    }
    for(int i=0;i<31;i++)
    {
        if(C[i]==0)
        {
            biti.push_back(i);
        }
    }
    biti.push_back(biti[0]+31);
    int index=0;
    for(int i=0;i<biti.size()-1;i++)
    {
        int dist=biti[i+1]-biti[i]-1;
        mat[dist][biti[i]]=1;
        for(int j=dist+1;j<66;j++)
        {
            mat[j][biti[i]]=M[index];
            index++;
        }
    }
    for(int i=0;i<66;i++)
    {
        send_packet(mat[i]);
    }
}
int viz[35][2];
int dfs(int curr,int par)
{
    if(viz[curr][par]==1)
        return 0;
    viz[curr][par]=1;
    return 1+dfs(nxt[curr],par);
}
std::vector<bool> receive_message(std::vector<std::vector<bool>> R)
{
    vector<bool>msg;
    for(int i=0;i<31;i++)
    {
        int cnt=0;
        while(R[cnt][i]!=1 && cnt<=31)
        {
            cnt++;
        }
        if(cnt>=17)
        {
            nxt[i]=i;
        }
        else
        {
            nxt[i]=(i+cnt+1)%31;
        }
    }
    for(int i=0;i<31;i++)
    {
        if(dfs(i,0)==16)
        {
            dfs(i,1);
            break;
        }
        else
        {
            for(int j=0;j<=30;j++)
            {
                viz[j][0]=0;
            }
        }
    }
    for(int i=0;i<31;i++)
    {
       if(viz[i][1]==1)
       {
           int diff=(nxt[i]+31-i)%31;
           for(int j=diff;j<66;j++)
           {
               msg.push_back(R[j][i]);
           }
           viz[i][1]=0;
       }
    }

    while(msg.back()==0)
    {
        msg.pop_back();
    }
    msg.pop_back();

    return msg;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...