#include <bits/stdc++.h>
#include "message.h"
using namespace std;
namespace Aisha{
vector<vector<bool>>R;
vector<bool> M_;
vector<bool>::iterator it;
int nxt[31];
void send_message(vector<bool> M,vector<bool> C)
{
vector<bool>().swap(M_),vector<vector<bool>>().swap(R);
M_.resize(1025);
R.resize(66,vector<bool>(31));
for(int i=0,lm=M.size();i<lm;i++) M_[i]=M[i];
M_[M.size()]=1;
for(int i=0;i<31;i++) if(!C[i])
{
nxt[i]=1;
while(C[(i+nxt[i])%31]) nxt[i]++;
R[nxt[i]-1][i]=1;
}
it=M_.begin();
for(int i=0;i<66;i++) for(int j=0;j<31;j++) if(!C[j]&&i>=nxt[j])
R[i][j]=*it,it++;
for(int i=0;i<66;i++) send_packet(R[i]);
}
}
namespace Basma{
int nxt[31],p[31];
int C[31];
vector<bool> M;
vector<bool>::iterator it;
vector<bool> receive_message(vector<vector<bool>> R)
{
M.resize(1025);it=M.begin();
for(int i=0;i<31;i++)
{
nxt[i]=1;C[i]=1;
while(nxt[i]<31&&!R[nxt[i]-1][i]) nxt[i]++;
p[i]=(i+nxt[i])%31;
}
bool abl=true;
for(int i=0;i<31&&abl;i++) for(int cnt=1,cur=p[i];cnt<=16;cnt++,cur=p[cur])
if(cur==i)
{
if(cnt!=16) break;
abl=false;
C[i]=0;
for(int cur=p[i];cur!=i;cur=p[cur]) C[cur]=0;
break;
}
for(int i=0;i<66;i++) for(int j=0;j<31;j++) if(!C[j]&&i>=nxt[j])
*it=R[i][j],it++;
while(*(M.end()-1)==0) M.pop_back();
M.pop_back();
return M;
}
}
void send_message(vector<bool> M,vector<bool> C){Aisha::send_message(M,C);}
vector<bool> receive_message(vector<vector<bool>> R){return Basma::receive_message(R);}