제출 #1210055

#제출 시각아이디문제언어결과실행 시간메모리
1210055trimkusMessage (IOI24_message)C++20
100 / 100
449 ms844 KiB
#include "message.h"
#include <bits/stdc++.h>
using namespace std;
const int LIMIT = 66;
void send_message(std::vector<bool> M, std::vector<bool> C) {
  std::vector<bool> A(31, 0);
  std::vector<bool> send[31];

  std::vector<int> zeros;
  for (int i = 0; i < 31; ++i) {
    if (C[i] == 0) {
      zeros.push_back(i);
    }
  }

  zeros.push_back(zeros[0] + 31);
  for (int i = 0, j = 1; i < 31; ++i) {
    if (C[i] == 0) {
      int dist = zeros[j] - i;
      for (int d = 1; d < dist; ++d) {
        send[i].push_back(1);
      }
      send[i].push_back(0);
      ++j;
    }
  }

  int cur = (int)M.size() - 1025;
  for (int i = 0; i < 31; ++i) {
    if (C[i] == 0) {
      while (cur < -1 && send[i].size() < LIMIT) {
        send[i].push_back(0);
        cur++;
      }
      while (cur == -1 && send[i].size() < LIMIT) {
        send[i].push_back(1); 
        cur++;
      }
      while (cur < (int)M.size() && send[i].size() < LIMIT) {
        send[i].push_back(M[cur++]);
      }
    } else {
      while (send[i].size() < LIMIT) {
        send[i].push_back(0);
      }
    }
  }

  for (int i = 0; i < LIMIT; ++i) {
    for (int j = 0; j < 31; ++j) {
      A[j] = send[j][i];
    }
    send_packet(A);
  }
}


std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
  std::vector<bool> C[31];
  int N = R.size();

  for (int i = 0; i < N; ++i) {
    for (int j = 0; j < 31; ++j) {
      C[j].push_back(R[i][j]);
    }
  }

  int diff[31] = {};
  for (int i = 0; i < 31; ++i) {
    if (C[i][0] == 0) {
      diff[i] = 1;
      C[i].erase(C[i].begin());
    } else {
      int d = 0;
      while (!C[i].empty() && C[i][0] == 1) {
        C[i].erase(C[i].begin());
        ++d;
      }
      diff[i] = d + 1;
      if (!C[i].empty()) C[i].erase(C[i].begin());
    }
  }

  int start = -1;
  for (int i = 0; i < 31; ++i) {
    if (diff[i] == 0) continue;
    int cur = i;
    int depth = 0;
    while (depth < 16) {
      cur = (cur + diff[cur]) % 31;
      ++depth;
      if (cur == i) break;
    }
    if (depth == 16 && cur == i) {
      start = i;
      break;
    }
  }
  assert(start != -1);
  vector<bool> res;
  int cur = start;
  bool started = false;
  for (int i = 0; i < 16; ++i) {
    for (auto u : C[cur]) {
      if (u == 1 && !started) {
        started = true;
        continue;
      }
      if (started) res.push_back(u);
    }
    cur = (cur + diff[cur]) % 31;
  }

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