#include "message.h"
#include <bits/stdc++.h>
using namespace std;
void send_message(std::vector<bool> message, std::vector<bool> typeBit) {
// cout << "send_message\n";
for (int i = 0; i < 31; i++) typeBit[i] = typeBit[i] ^ 1;
int firstOpenBit = 0;
for (int iBit = 0; iBit < 31; iBit++) {
if (typeBit[iBit]) {
firstOpenBit = iBit;
break;
}
}
vector<bool> messageZero(31, 0), messageOne(31, 1);
for (int i = 0; i < 4; i++) {
if ((1 << i)&firstOpenBit) {
send_packet(messageOne);
}
else {
send_packet(messageZero);
}
}
// cout << "sent: ";
int numBitsSent = 0, numMessageSent = 0;
for (int iBit = firstOpenBit+1; iBit < 30; iBit++) {
vector<bool> packet(31, 0);
packet[firstOpenBit] = typeBit[iBit];
for (int i = 0; i < 31; i++) {
if (typeBit[i] && i != firstOpenBit && numBitsSent < 10) {
packet[i] = (1 << numBitsSent)&((int)message.size() - 1);
numBitsSent++;
}
else if (typeBit[i] && i != firstOpenBit && numMessageSent < (int)message.size()) {
packet[i] = message[numMessageSent];
// cout << packet[i] << " ";
numMessageSent++;
}
}
send_packet(packet);
}
// cout << "\n";
while (numMessageSent < (int)message.size()) {
vector<bool> packet(31, 0);
for (int i = 0; i < 31; i++) {
if (typeBit[i] && numMessageSent < (int)message.size()) {
packet[i] = message[numMessageSent];
numMessageSent++;
}
}
send_packet(packet);
}
}
std::vector<bool> receive_message(std::vector<std::vector<bool>> receive) {
// cout << "receive_message\n";
// cout << "size: " << (int)receive.size() << "\n";
int firstOpenBit = 0;
for (int i = 0; i < 4; i++) {
int num1 = 0;
for (int j = 0; j < 31; j++) {
if (receive[i][j]) num1++;
}
if (num1 >= 16) firstOpenBit += (1 << i);
}
// cerr << "firstOpenBit: " << firstOpenBit << "\n";
vector<bool> typeBit(31, 0);
typeBit[firstOpenBit] = true;
int num1 = 1;
for (int i = 4; i < 34 - firstOpenBit - 1; i++) {
if (receive[i][firstOpenBit]) {
typeBit[i - 4 + firstOpenBit + 1] = true;
num1++;
}
}
if (num1 < 16) typeBit[30] = true;
// cout << "typeBits: ";
// for (int i = 0; i < 31; i++) cout << (typeBit[i]^1) << " ";
// cout << "\n";
int lenMessage = 0;
int numOpenSeen = 0;
for (int i = 0; i < 31; i++) {
if (i != firstOpenBit && typeBit[i] && numOpenSeen < 10) {
lenMessage += (1 << numOpenSeen) * receive[4][i];
numOpenSeen++;
}
}
lenMessage++;
// cout << "lenMessage: " << lenMessage << "\n";
vector<bool> message;
numOpenSeen = 0;
// cout << "received: ";
for (int j = 4; j < 34 - firstOpenBit - 1; j++) {
for (int i = 0; i < 31; i++) {
if (typeBit[i]) {
if (numOpenSeen > 10 && i != firstOpenBit) {
// cout << receive[j][i] << " ";
message.push_back(receive[j][i]);
}
numOpenSeen++;
}
}
}
// cout << "\n";
for (int i = 34 - firstOpenBit - 1; i < (int)receive.size(); i++) {
for (int j = 0; j < 31; j++) {
if (typeBit[j]) {
message.push_back(receive[i][j]);
}
}
}
// cout << "message: ";
// for (int i = 0; i < (int)message.size(); i++) cerr << message[i] << " ";
// cout << "\n";
message.resize(lenMessage);
return message;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |