Submission #1190042

#TimeUsernameProblemLanguageResultExecution timeMemory
1190042SalihSahinMessage (IOI24_message)C++20
43.96 / 100
439 ms864 KiB
#include "bits/stdc++.h"
#define pb push_back
#include "message.h"
using namespace std;
#define ll long long


void send_message(vector<bool> M, vector<bool> C) {
  int N = M.size();

  vector<bool> A(31, 0), B(31, 1);
  vector<int> cnt(2), zind;
  int ind = 0;
  while(ind < 31){
    if(cnt[0] == 0){
      if(C[ind] == 0) send_packet(A);
      else send_packet(B);
      cnt[C[ind]]++;
      if(C[ind] == 0) zind.pb(ind);
      ind++;
    }
    else{
      vector<bool> pac(31, 0);
      int oldind = ind;
      for(auto itr: zind){
        if(ind > 30) break;
        pac[itr] = C[ind++];
      }

      for(int j = oldind; j < ind; j++){
        if(C[j] == 0) zind.pb(j);
      }
      send_packet(pac);
    }
  }

    vector<bool> dis_packet = A;
    int bt = 1;
    for(int j = 0; j < 31; j++){
       if(C[j] == 0){
          if(bt & N) dis_packet[j] = 1;
          bt *= 2;
       }
    }
    send_packet(dis_packet);

  for(int i = 0; i < N; i += 16){
    vector<bool> packet = A;
    int ind = 0;
    for(int j = 0; j < 31; j++){
        if(C[j] == 1) continue;
        if(i + ind < N) packet[j] = M[i + ind];
        ind++;
    }
    send_packet(packet);
  }
}

vector<bool> receive_message(vector<vector<bool>> R){
    int n = R.size();

    vector<int> C(31);
    vector<int> cnt(2), zind;
    int ind = 0, mind = 0;
    while(ind < 31){
      if(cnt[0] == 0){
        int sum = 0;
        for(int j = 0; j < 31; j++){
          sum += R[mind][j];
        }
        if(sum >= 16) C[ind] = 1;
        else C[ind] = 0;

        cnt[C[ind]]++;
        if(C[ind] == 0) zind.pb(ind);
        ind++;
        mind++;
      }
      else{
        int oldind = ind;
        for(int j = 0; j < oldind; j++){
          if(C[j] == 0){
            if(ind > 30) break;
            C[ind] = R[mind][j];
            ind++;
          }
        }

        for(int j = oldind; j < ind; j++){
          if(C[j] == 0) zind.pb(j);
        }
        mind++;
      }
    }

    int len = 0, bt = 1;
    for(int i = mind; i <= mind; i++){
        for(int j = 0; j < 31; j++){
            if(C[j] == 0){
                if(R[i][j] == 1) len += bt;
                bt *= 2;
            }
        }
    }
    mind++;

    vector<bool> message;
    for(int i = mind; i < n; i++){
        for(int j = 0; j < 31; j++){
            if(C[j] == 0) message.pb(R[i][j]);
        }
    }
    while(message.size() > len) message.pop_back();

    return message;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...