제출 #1191687

#제출 시각아이디문제언어결과실행 시간메모리
1191687hamzabc메시지 (IOI24_message)C++20
87.16 / 100
389 ms872 KiB
#include "message.h"
#include <bits/stdc++.h>


using namespace std;



void send_message(vector<bool> M, vector<bool> C) {
  vector<int> P(31, 0);
  int j = 0, k = 0;
  while (C[j]) j++;
  bool flag = false;
  for (int i = j; ; i++){
    i %= 31;
    if (i == j){
      if (flag){
        break;
      }
      flag = true;
    }
    if (C[i] == 0)
      k = i;
    else
      P[k]++;
  }
  vector<bool> A(31, 0);
  for (int b = 0; b < 4; b++){
    for (int i = 0; i < 31; i++){
      A[i] = P[i] % (1LL << (b + 1)) >= (1LL << b);
    }
    send_packet(A);
  }
  for (int i = 0; i < (M.size() - 1) / 16 + 1; i++){
    k = 0;
    for (int j = 0; j < 31; j++){
      if (C[j] == 0){
        A[j] = M[i * 16 + k];
        k++;
        if (i * 16 + k == M.size())
        break;
      }
    }
    send_packet(A);
  }
  k = 0;
  for (int j = 0; j < 31; j++){
    if (C[j] == 0){
      if (M.size() % 16)
      A[j] = M.size() % 16 > k;
      else
      A[j] = 1;
      k++;
    }
  }
  send_packet(A);
}

vector<bool> receive_message(vector<vector<bool>> R) {
  vector<int> P(31, 0);
  for (int i = 0; i < 31; i++){
    P[i] = R[0][i] + R[1][i] * 2 + R[2][i] * 4 + R[3][i] * 8;
  }
  vector<int> vis(31);
  vector<int> C(31);
  for (int i = 0; i < 31; i++){
    int cnt = 1;
    int j = i;
    while (vis[j] == 0){
      vis[j] = cnt;
      cnt++;
      j = j + P[j] + 1;
      j %= 31;
    }
    if (cnt - vis[j] == 16){
      while (vis[j] != INT_MAX){
        vis[j] = INT_MAX;
        C[j] = true;
        j = j + P[j] + 1;
        j %= 31;
      }
    }else{
      while (vis[j] != INT_MAX){
        vis[j] = INT_MAX;
        j = j + P[j] + 1;
        j %= 31;
      }
    }
  }
  vector<bool> ret;
  for (int i = 4; i < R.size() - 1; i++){
    for (int j = 0; j < 31; j++){
      if (C[j])
        ret.push_back(R[i][j]);
    }
  }
  for (int j = 0; j < 31; j++){
    if (C[j] && R[R.size() - 1][j] == 0)
      ret.pop_back();
  }
  return ret;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...