Submission #1268752

#TimeUsernameProblemLanguageResultExecution timeMemory
1268752vincentbucourt1Message (IOI24_message)C++20
0 / 100
163 ms816 KiB
#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);
    }
  }
  
  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());
        numBitsSent++;
      }
      else if (typeBit[i] && i != firstOpenBit && numMessageSent < (int)message.size()) {
        packet[i] = message[numMessageSent];
        numMessageSent++;
      }
    }
    send_packet(packet);
  }
  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 = 0;
  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++;
    }
  }
  // cout << "lenMessage: " << lenMessage << "\n";

  vector<bool> message;
  numOpenSeen = 0;
  for (int i = 0; i < 31; i++) {
    if (typeBit[i]) {
      if (numOpenSeen > 10) {
        message.push_back(receive[4][i]);
      }
      numOpenSeen++;
    }
  }
  for (int i = 5; i < (int)receive.size(); i++) {
    for (int j = 0; j < 31; j++) {
      if (typeBit[j] && (i >= 33 - firstOpenBit || j != firstOpenBit)) {
        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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...