제출 #1194616

#제출 시각아이디문제언어결과실행 시간메모리
1194616aykhn메시지 (IOI24_message)C++20
81.45 / 100
425 ms848 KiB
#include "message.h"
#include <bits/stdc++.h>

using namespace std;

void send_message(vector<bool> M, vector<bool> C) 
{
  int x = 0;
  while (C[x]) x++;
  for (int i = 0; i < 4; i++) send_packet(vector<bool>(31, x >> i & 1));
  vector<bool> real;
  for (int i = 0; i < 1025 - (int)M.size() - 1; i++) real.push_back(0);
  real.push_back(1);
  for (int i = 0; i < M.size(); i++) real.push_back(M[i]);
  assert(real.size() == 1025);
  int cur = 0;
  for (int i = 0; i < 31; i++)
  {
    vector<bool> v(31, 0);
    for (int j = 0; j < 31; j++)
    {
      if (j == x || C[j] == 1) continue;
      v[j] = real[cur++];
    }
    v[x] = C[i];
    send_packet(v);
  }
  while (cur < 1025)
  {
    vector<bool> v(31, 0);
    for (int j = 0; cur < 1025 && j < 31; j++)
    {
      if (C[j] == 1) continue;
      v[j] = real[cur++];
    }
    send_packet(v);
  }
}

vector<bool> receive_message(vector<vector<bool>> R) 
{
  auto get = [](vector<bool> A)
  {
    int cnt = 0;
    for (int i : A) cnt += i;
    return cnt >= 16;
  };
  int x = 0;
  for (int i = 0; i < 4; i++)
  {
    if (get(R[i])) x |= (1 << i);
  }
  vector<bool> res;
  int C[31];
  for (int i = 4; i < 4 + 31; i++) C[i - 4] = R[i][x];
  for (int i = 4; i < R.size(); i++)
  {
    for (int j = 0; res.size() < 1025 && j < 31; j++)
    {
      if ((i >= 35 || j != x) && C[j] == 0) res.push_back(R[i][j]);
    }
  }
  vector<bool> real;
  int i = 0;
  while (res[i] == 0) i++;
  for (i++; i < res.size(); i++) real.push_back(res[i]);
  return real;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...