Submission #261475

#TimeUsernameProblemLanguageResultExecution timeMemory
261475themax23Data Transfer (IOI19_transfer)C++17
100 / 100
245 ms2884 KiB
#include "transfer.h"
#include <bits/stdc++.h>
using namespace std;

std::vector<int> get_attachment(std::vector<int> source) {
    int t = 0, n = (int)source.size();
    if(n == 63) t = 6; //log2(63)
    else t = 8;		   //log2(255)	
    vector<int> attachment;
    int k = n+1;
    for(int i = 0; i < t; ++i){
		  int checkbit = 0;
		  for(int start_idx = 0; start_idx < n; start_idx += k){
			  for(int idx = 0; idx < k/2; ++idx){
					checkbit ^= source[start_idx + idx];
			  }
		  }
		  k /= 2;
		  attachment.push_back(checkbit);
	}
	int attachment_bit = 0;
	for(int it : attachment)
		attachment_bit ^= it;
    attachment.push_back(attachment_bit);
    return attachment;
    
}

std::vector<int> retrieve(std::vector<int> data) {
    int check, N, K;
    check = (int)data.size();
    if(check == 70) 
		{N = 63; K = 7;}
	else 
		{N = 255; K = 9;}
	vector<int> src;
	for(int j = 0; j < N; ++j)
		src.push_back(data[j]);
	int fcbit = 0;
	for(int i = N; i < N+K-1; ++i)
		fcbit ^= data[i];
	if(fcbit != data[N+K-1])
		return src;
	
	int k = N+1, t = K-1;
	string find = "";
    for(int i = 0; i < t; ++i){
		  int checkbit = 0;
		  for(int start_idx = 0; start_idx < N; start_idx += k){
			  for(int idx = 0; idx < k/2; ++idx){
					checkbit ^= data[start_idx + idx];
			  }
		  }
		  k /= 2;
		  if(checkbit == data[N+i])
			find += "R";
		  else
			find += "L";
	}
	int err_idx = 0;
	int f = (N+1) / 2;
	for(char x : find){
		if(x == 'R') err_idx += f;
		f /=2;
	}
	//if(err_idx == N) err_idx = N-1;
	src[err_idx] ^= 1;
	return src;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...