#include "message.h"
#include<bits/stdc++.h>
using namespace std;
#define ff first
#define ss second
#define pb push_back
void send_message(std::vector<bool> M, std::vector<bool> C) {
vector<int>idx;
for(int i=0;i<31;i++){
if(C[i]==0)idx.pb(i); //16 shirheg
}
idx.pb(idx[0]);
for(int i=0;i<5;i++){
vector<bool>v(31);
for(int j=0;j<16;j++){
v[idx[j]]= bool ((1<<i) & (idx[j+1]));
}
send_packet(v);
}
int L=M.size();
vector<bool>tmp(31);
for(int i=0;i<15;i++){
if(L & (1<<i)){
tmp[idx[i]]=1;
}
}
send_packet(tmp);
for(int i=0;i<L/16;i++){
vector<bool>v(31);
for(int j=0;j<16;j++){
v[idx[j]]=M[i*16+j];
}
send_packet(v);
}
if(L%16){
vector<bool>v(31);
for(int j=0;j<L%16;j++){
v[idx[j]]=M[L-L%16+j];
}
send_packet(v);
}
}
std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
int P = (int)R.size();
vector<int> child(31,0);
for(int t=0;t<5 && t<P;t++){
for(int j=0;j<31;j++){
if(R[t][j]) child[j] |= (1<<t);
}
}
vector<int> vis(31,0);
vector<int> idx;
for(int start=0; start<31; ++start){
if(vis[start]) continue;
int cur = start;
unordered_map<int,int> pos;
int step = 0;
while(pos.find(cur) == pos.end()){
if(vis[cur]) break;
pos[cur] = step++;
cur = child[cur];
}
if(pos.find(cur) != pos.end()){
int cycle_len = step - pos[cur];
if(cycle_len == 16){
int node = cur;
for(int k=0;k<16;k++){
idx.pb(node);
node = child[node];
}
break;
}
}
for(auto &p : pos) vis[p.first]=1;
}
if(idx.empty()) return {};
int L=0;
for(int i=0;i<15;i++){
if(R[5][idx[i]])L+=(1<<i);
}
vector<bool>M(L);
for(int i=0;i<L/16;i++){
vector<bool>v(31);
for(int j=0;j<16;j++){
M[i*16+j]=R[i+6][idx[j]];
}
}
if(L%16){
vector<bool>v(31);
for(int j=0;j<L%16;j++){
M[L-L%16+j]=R.back()[idx[j]];
}
}
return M;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |