Submission #1221640

#TimeUsernameProblemLanguageResultExecution timeMemory
1221640thangdz2k7Data Transfer (IOI19_transfer)C++20
100 / 100
161 ms1728 KiB
#include "transfer.h"

#include <bits/stdc++.h>

using namespace std;

vector <int> get_attachment(vector <int> source){
	int N = source.size();
	int K = 6;
	if (N == 255) K = 8;

	vector <int> data;
	int all = 0;
	for (int i = 0; i < N; ++ i) 
		all ^= source[i];
		
	data.push_back(all);

	for (int b = 0; b < K; ++ b){
		int cur = 0;
		for (int i = 0; i < N; ++ i) if (((i + 1) >> b) & 1)
			cur ^= source[i];

		data.push_back(cur);
	}

	return data;
}

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

	int N = data.size();
	int K = 6;
	if (N > 255) N = 255, K = 8;
	else N -= 7;

	vector <int> source;
	for (int i = 0; i < N; ++ i) 
		source.push_back(data[i]);

	int all = 0;
	for (int i = 0; i < N; ++ i) 
		all ^= data[i];

	if (all == data[N]) return source;

	int flip = 0;
	for (int b = 0; b < K; ++ b){
		int cur = 0;
		for (int i = 0; i < N; ++ i) if (((i + 1) >> b) & 1)
			cur ^= data[i];

		if (cur != data[N + b + 1]) flip |= (1 << b);
	}

	if (flip) source[flip - 1] ^= 1;
	return source;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...