Submission #1193857

#TimeUsernameProblemLanguageResultExecution timeMemory
1193857chaeryeongData Transfer (IOI19_transfer)C++20
100 / 100
72 ms1868 KiB
#include "transfer.h"
#include <bits/stdc++.h>
using namespace std;
vector <int> get_attachment (vector <int> source) {
	int sum = 0;
	for (int i = 0; i < (int)source.size(); i++) {
		if (source[i] == 1) {
			sum ^= i + 1;
		}
	}
	vector <int> ret;
	if (source.size() == 63) {
		for (int j = 0; j < 6; j++) {
			ret.push_back((sum >> j) & 1);
		}
	} else {
		for (int j = 0; j < 8; j++) {
			ret.push_back((sum >> j) & 1);
		}
	}
	int check_sum = 0;
	for (auto i : ret) {
		check_sum ^= i;
	}
	ret.push_back(check_sum);
	return ret;
}

vector <int> retrieve (vector <int> data) {
	int N;
	if (data.size() > 200) {
		N = 255;
	} else {
		N = 63;
	}
	vector <int> rr;
	for (int i = 0; i < N; i++) {
		rr.push_back(data[i]);
	}
	int v = 0;
	for (int i = N; i + 1 < (int)data.size(); i++) {
		v ^= data[i];
	}
	if (v != data.back()) return rr;
	int sum = 0;
	for (int i = N; i + 1 < (int)data.size(); i++) {
		sum ^= data[i] * (1 << (i - N));
	}
	//sum is sum of one positions
	int sum2 = 0;
	for (int i = 0; i < N; i++) {
		if (rr[i] == 1) {
			sum2 ^= i + 1;
		}
	}
	if (sum == sum2) return rr;
	int x = sum ^ sum2;
	rr[x - 1] ^= 1;
	return rr;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...