#include "message.h"
#include <bits/stdc++.h>
using namespace std;
#define ff first
#define ss second
#define pb push_back
static vector<bool> toBoolVec(const vector<int>& v){
vector<bool> r(v.size());
for(size_t i=0;i<v.size();++i) r[i] = (v[i] != 0);
return r;
}
static vector<vector<int>> RtoInt(const vector<vector<bool>>& Rb){
vector<vector<int>> R(Rb.size(), vector<int>(31,0));
for(size_t i=0;i<Rb.size();++i) for(int j=0;j<31;++j) R[i][j] = Rb[i][j] ? 1 : 0;
return R;
}
void send_message(vector<bool> M_bool, vector<bool> C_bool) {
vector<int> M;
for(bool b : M_bool) M.pb(b ? 1 : 0);
vector<int> C(31);
for(int i=0;i<31;i++) C[i] = C_bool[i] ? 1 : 0;
int x = -1;
for(int i=0;i<31;i++){
if(C[i]==0){
x = i;
break;
}
}
if(x == -1) x = 0;
for(int i=0;i<5;i++){
vector<int> v(31,0);
int b = (x>>i)&1;
for(int j=0;j<31;j++) v[j] = b;
send_packet(toBoolVec(v));
}
vector<int> msg;
int S = (int)M.size();
int z = 1025 - S - 1;
for(int i=0;i<z;i++) msg.pb(0);
msg.pb(1);
for(int b: M) msg.pb(b);
int ptr = 0;
for(int i=0;i<31;i++){
vector<int> v(31,0);
v[x] = C[i];
for(int j=0;j<31 && ptr < (int)msg.size(); j++){
if(j == x) continue;
if(C[j] == 0){
v[j] = msg[ptr++];
} else {
v[j] = 0;
}
}
send_packet(toBoolVec(v));
}
while(ptr < (int)msg.size()){
vector<int> v(31,0);
v[x] = 0;
for(int j=0;j<31 && ptr < (int)msg.size(); j++){
if(j == x) continue;
if(C[j] == 0){
v[j] = msg[ptr++];
} else v[j] = 0;
}
send_packet(toBoolVec(v));
}
}
vector<bool> receive_message(vector<vector<bool>> Rb) {
vector<vector<int>> R = RtoInt(Rb);
if(R.size() < 5) return vector<bool>();
int x = 0;
for(int i=0;i<5;i++){
int c = 0;
for(int j=0;j<31;j++) c += R[i][j];
if(c >= 16) x |= (1<<i);
}
x &= 31; // safety
vector<int> C(31,1);
if(R.size() >= 5 + 31){
for(int i=0;i<31;i++){
C[i] = R[5 + i][x];
}
} else {
// fallback: if not enough packets to read all C, try using what we have
int available = (int)R.size() - 5;
for(int i=0;i<available && i<31;i++) C[i] = R[5 + i][x];
for(int i=available;i<31;i++) C[i] = 1;
}
vector<int> msg;
for(size_t i=5;i<R.size();i++){
for(int j=0;j<31;j++){
if(j == x) continue;
if(C[j] == 0) msg.pb(R[i][j]);
}
}
int pos = 0;
while(pos < (int)msg.size() && msg[pos] == 0) pos++;
if(pos >= (int)msg.size()) return vector<bool>();
pos++;
vector<bool> M;
for(int i=pos;i<(int)msg.size();i++) M.pb(msg[i] ? true : false);
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... |