# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1197712 | ansori | Message (IOI24_message) | C++20 | 0 ms | 0 KiB |
#include "grader.h"
#include<bits/stdc++.h>
using namespace std;
vector<bool> send_packet(vector<bool> A);
void send_message(std::vector<bool> M, std::vector<bool> C) {
int p0;
for(int i = 0;i < 31; ++ i){
if(! C[i]){
p0 = i;
for(int j = 0;j < 4; ++ j){
send_packet(vector<bool> (31 , ((i & (1 << j)) > 0)));
}
break;
}
}
int c1 = 0 , sz = 0 , szm = M.size();
for(int i = 0;i < 31; ++ i){
if(i == p0) continue ;
vector<bool> v(31 , 0);
for(int j = 0;j < 31; ++ j){
if(j != p0 and C[j] == 0 and sz < szm){
v[j] = M[sz ++];
}
if(j == p0) v[j] = C[i];
}
send_packet(v);
}
int b = 0;
vector<bool> v(31 , 0);
for(int i = 0;i < 31; ++ i){
if(C[i] == 0){
if(b <= 10){
if(szm & (1 << b)) v[i] = 1;
else v[i] = 0;
b ++;
}
else{
if(sz < szm){
v[i] = M[sz ++];
}
}
}
}
send_packet(v);
while(sz < szm){
v = vector<bool> (31 , 0);
for(int i = 0;i < 31; ++ i){
if(C[i] == 0 and sz < szm){
v[i] = M[sz ++];
}
}
send_packet(v);
}
}
std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
vector<bool> msg;
deque<vector<bool>> p;
//cout << -1;
for(auto to : R) p.push_back(to);
int p0 = 0;
for(int i = 0;i < 4; ++ i){
int a = 0;
for(int j = 0;j < 31; ++ j){
if(p[i][j]) a ++;
else a --;
}
if(a > 0) p0 += (1 << i);
}
for(int i = 0;i < 4; ++ i) p.pop_front();
vector<bool> c(31 , 0);
c[p0] = 0;
int ps = 0;
for(int i = 0;i < 31; ++ i){
if(i == p0) continue ;
c[i] = p[ps][p0];
ps ++;
}
int szm = 0;
for(int i = 0;i < 30; ++ i){
for(int j = 0;j < 31; ++ j){
if(j != p0 and c[j] == 0){
szm ++;
msg.push_back(p[i][j]);
}
}
}
for(int i = 0;i < 30; ++ i) p.pop_front();
int b = 0 , rsz = 0;
for(int i = 0;i < 31; ++ i){
if(c[i] == 0){
if(b <= 10){
if(p[0][i]) rsz += (1 << b);
b ++;
}
else{
msg.push_back(p[0][i]);
}
}
}
p.pop_front();
while(msg.size() < rsz){
for(int i = 0;i < 31; ++ i){
if(c[i] == 0) msg.push_back(p[0][i]);
}
p.pop_front();
}
while(msg.size() > rsz) msg.pop_back();
return msg;
}