#include <bits/stdc++.h>
using namespace std ;
vector<bool> send_packet(vector<bool> A);
vector<vector<bool>> encode(int num, const int &d) {
vector<vector<bool>> res ;
for(int i = d - 1; i > -1; i --) {
res.emplace_back(vector<bool>(31, (bool)(num >> i & 1))) ;
}
return res ;
}
void send_message(vector<bool> M, vector<bool> C) {
// SEND C WITH OPTIMIZATIONS
int ma = 0, pos = -1 ;
for(int i = 0; i < 31; i ++) if(!C[i]) {
int j = i ;
while(j < 30 && !C[j + 1]) ++ j ;
if(j - i + 1 > ma) {
ma = j - i + 1 ; pos = i ;
}
i = j ;
}
if(ma == 1) {
vector<vector<bool>> buck = encode(31, 5) ;
for(vector<bool> &cur : buck) {
send_packet(cur) ;
}
}
else {
vector<vector<bool>> buck = encode(pos, 5) ;
for(vector<bool> &cur : buck) {
send_packet(cur) ;
}
for(int i = 0; i < 31; i ++) {
while(i >= pos && i < pos + 2) ++ i ;
int j = i + 1 ;
while(j >= pos && j < pos + 1) ++ j ;
if(j >= 31) break ;
vector<bool> pack(31, false) ;
pack[pos] = C[i] ; pack[pos + 1] = C[j] ;
send_packet(pack) ;
i = j ;
}
}
// SEND MESSAGE STRAIGHTLY FOWARD
vector<int> idx ;
for(int i = 0; i < 31; i ++) {
if(!C[i]) idx.emplace_back(i) ;
}
int s = (int)M.size() - 1 ;
reverse(M.begin(), M.end()) ;
for(int i = 0; i < 10; i ++) {
M.emplace_back((bool)(s >> i & 1)) ;
}
reverse(M.begin(), M.end()) ;
for(int i = 0; i < M.size();) {
vector<bool> pack(31, false) ;
int x = min((int)M.size() - i, 16) ;
for(int j = 0; j < x; j ++) {
pack[idx[j]] = M[i] ; ++ i ;
}
send_packet(pack) ;
}
}
vector<bool> receive_message(vector<vector<bool>> R) {
// DECODE THE STRING C
int pos = 0 ;
for(int i = 0; i < 5; i ++) {
vector<int> cnt(2, 0) ;
for(int j = 0; j < 31; j ++) {
++ cnt[(int)R[i][j]] ;
}
pos = pos << 1 | ((int)(cnt[1] > cnt[0])) ;
}
// cerr << pos << ' ' ;
int num = 5 ;
vector<int> idx ;
if(pos == 31) {
for(int d = 0; d < 31; d += 2) {
idx.emplace_back(d) ;
}
}
else {
num = 19 ;
int cur = -1, sum = 0 ;
idx.emplace_back(pos) ;
idx.emplace_back(pos + 1) ;
for(int i = 0; i < 14; i ++) {
for(int x : {pos, pos + 1}) {
++ cur ;
while(cur >= pos && cur < pos + 2) ++ cur ;
if(!R[i + 5][x]) idx.emplace_back(cur) ;
// cerr << cur << ' ' << x << endl ;
sum += (int)R[i + 5][x] ;
}
}
if(sum < 16) {
++ cur ;
while(cur >= pos && cur < pos + 2) ++ cur ;
idx.emplace_back(cur) ;
}
sort(idx.begin(), idx.end()) ;
}
// cerr << "Finished decoding C\n" ;
// DECODE THE SIZE OF MESSAGE AND ITS BITS
int numSz = 0 ;
for(int i = 0; i < 10; i ++) {
numSz = numSz << 1 | ((int)R[num][idx[i]]) ;
}
++ numSz ;
int iter = 9 ;
vector<bool> res ;
for(; numSz > 0; numSz --) {
if(++ iter == 16) iter = 0, ++ num ;
res.emplace_back(R[num][idx[iter]]) ;
}
return res ;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |