Submission #1243787

#TimeUsernameProblemLanguageResultExecution timeMemory
1243787MarwenElarbiMessage (IOI24_message)C++20
10 / 100
372 ms844 KiB
#include <bits/stdc++.h>
#include "message.h"
using namespace std;
void send_message(std::vector<bool> M, std::vector<bool> C) {
  vector<int> controlled;
  for (int i = 0; i < 31; ++i)
  {
    if(!C[i]) controlled.push_back(i);
  }
  for (int i = 0; i < 5; ++i)
  {
    vector<bool> A(31,0);
    for (int j = 0; j < 16; ++j)
    {
      A[controlled[j]] = ((1<<i) & controlled.back());
    }
    send_packet(A);
  }
  int S = M.size();
  vector<bool> A(31,0);
  for (int i = 0; i < 10; ++i)
  {
    A[controlled[i]] = ((1<<i) & S) ;
  }
  int k = 0;
  int j = 0;
  for (int i = 10; i < 15; ++i)
  {
    A[controlled[i]] = M[min(S-1,k++)];
  }
  A[controlled.back()]=C[j++];
  
  send_packet(A);
  while(k <= S || j<=30){
    for (int i = 0; i < 15; ++i)
    {
      A[controlled[i]] = M[min(S-1,k++)];
    }
    A[controlled.back()]=C[min(30,j++)];
    send_packet(A);
  }
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
  vector<int> nabba[32];
  for (int i = 0; i < 31; ++i)
  {
    int cnt=0;
    for (int j = 0; j < 5; ++j)
    {
      //cout <<R[j][i]<<" ";
      cnt+=(R[j][i]<<j);
    }//cout <<endl;
    nabba[cnt].push_back(i);
  }
  int control=0;
  //cout <<"hey"<<endl;
  for (int i = 0; i < 31; ++i){
    //cout << (int)nabba[i].size() <<" ";
    if((int)nabba[i].size()>=16) 
      control = i;
  }//cout <<endl;
  //cout <<control<<endl;
  vector<bool> C(31,0);
  vector<int> controlled;
  for (int i = 5; i < 36; ++i)
  {
    C[i-5]=R[i][control];
    if(!C[i-5]) controlled.push_back(i-5);
    //cout << C[i-5]<<" ";
  }//cout <<endl;
  int S = 0;
  for (int i = 0; i < 10; ++i)
  {
    S += (R[5][controlled[i]]<<i);
    //cout << R[5][controlled[i]]<<" "<<controlled[i]<<endl;
  }
  //cout << S<<endl;
  vector<bool> ans;
  for (int i = 10; i < 15; ++i)
  {
    if((int)ans.size()+1<=S) ans.push_back(R[5][controlled[i]]);
  }
  int j=6;
  while((int)ans.size()<S){
    for (int i = 0; i < 15; ++i)
    {
      if((int)ans.size()+1<=S) ans.push_back(R[j][controlled[i]]);
    }
    j++;
  }
  return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...