제출 #1127189

#제출 시각아이디문제언어결과실행 시간메모리
1127189julia_08Data Transfer (IOI19_transfer)C++20
100 / 100
87 ms1744 KiB
#include "transfer.h"
#include <bits/stdc++.h>

using namespace std;

vector<int> get_attachment(vector<int> source){

  int l = 9;

  if(source.size() == 63) l = 7;

  vector<int> ans;

  int xor_sum = 0, x = 0;

  for(int i=0; i<(int) source.size(); i++){
    if(source[i] == 1){
      xor_sum ^= (i + 1);
    }
  }

  for(int i=0; i<l-1; i++){
    if(xor_sum & (1 << i)){
      x ^= 1;
    }
  }

  ans.push_back(x);

  // cout << "xor_sum = " << xor_sum << "\n";

  for(int i=0; i<l-1; i++){
    if(xor_sum & (1 << i)){
      ans.push_back(1);

    } else ans.push_back(0);
  }

  return ans;
}

vector<int> retrieve(vector<int> data){

  // for(auto x : data) cout << x << " ";
  // cout << "\n";

  int l = 9;

  if(data.size() == 70) l = 7;

  vector<int> ans;

  int xor_sum = 0, x = 0;

  for(int i=data.size()-(l-1); i<data.size(); i++){
    if(data[i] == 1){
      xor_sum += (1 << (i - data.size() + (l - 1)));
      x ^= 1;
    }
  }

  int xor_one = 0;

  for(int i=0; i<data.size()-l; i++){
    if(data[i] == 1){
      xor_one ^= (i + 1);
    }
  }

  // cout << "xor_sum = " << xor_sum << "\n";
  // cout << "xor_one = " << xor_one << "\n";
  // cout << "x = " << x << ", data[" << data.size() - l << "] = " << data[data.size() - l] << "\n";

  if(x != data[data.size() - l]){
    for(int i=0; i<data.size()-l; i++){
      ans.push_back(data[i]);
    }

  } else{
    for(int i=0; i<data.size()-l; i++){
      if((xor_one ^ xor_sum) == (i + 1)){
        ans.push_back(1 - data[i]);

      } else ans.push_back(data[i]);
    }
  }

  // for(auto x : ans) cout << x << " ";
  // cout << "\n";

  // cout << (xor_one ^ xor_sum) << "\n";

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