#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)
{
reverse(M.begin(),M.end());
M.push_back(1);
while(M.size()<1025)
{
M.push_back(0);
}
reverse(M.begin(),M.end());
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 bune[35];
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++;
}
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]);
}
}
}
reverse(msg.begin(),msg.end());
while(msg.back()==0)
{
msg.pop_back();
}
msg.pop_back();
reverse(msg.begin(),msg.end());
return msg;
}