제출 #560620

#제출 시각아이디문제언어결과실행 시간메모리
560620MilosMilutinovicData Transfer (IOI19_transfer)C++14
100 / 100
328 ms2500 KiB
#include "transfer.h"
#include <bits/stdc++.h>

using namespace std;

vector<int> get_attachment(vector<int> source) {
  int K = 9;
  if (source.size() == 63) {
    K = 7;
  }
  int n = source.size();
  vector<int> ret(K);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < K - 1; j++) {
      if ((i + 1) >> j & 1) {
        ret[j] ^= source[i];
      }
    }
    ret[K - 1] ^= source[i];
  }
  return ret;
}

vector<int> retrieve(vector<int> data) {
  int K = 9;
  if (data.size() < 255) {
    K = 7;
  }
  int n = data.size();
  int f = 0;
  for (int i = 0; i < n - K; i++) {
    f ^= data[i];
  }
  vector<int> ans(n - K);
  for (int i = 0; i < n - K; i++) {
    ans[i] = data[i];
  }
  if (f == data.back()) {
    return ans;
  }
  vector<int> r(8);
  for (int i = 0; i < n - K; i++) {
    for (int j = 0; j < K - 1; j++) {
      if ((i + 1) >> j & 1) {
        r[j] ^= data[i];
      }
    }
  }
  int pos = 0;
  for (int i = 0; i < K - 1; i++) {
    if (r[i] != data[n - K + i]) {
      pos += (1 << i);
    }
  }
  if (pos != 0) {
    pos--;
    ans[pos] ^= 1;
  }
  return ans;
}

/*
5
0 011001010110110110100111110011010111111111111000101011100101001
7 011001010110110110100111110011010111111111111000101011100101001
62 011001010110110110100111110011010111111111111000101011100101001
63 011001010110110110100111110011010111111111111000101011100101001
-1 011001010110110110100111110011010111111111111000101011100101001

*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...