제출 #530907

#제출 시각아이디문제언어결과실행 시간메모리
530907KoDData Transfer (IOI19_transfer)C++17
100 / 100
58 ms2608 KiB
#include "transfer.h"

std::vector<int> get_attachment(std::vector<int> source) {
	const int n = source.size();
	int sum = 0;
	for (int i = 0; i < n; ++i) {
		sum ^= source[i] * (i + 1);
	}
	const int k = n == 63 ? 6 : 8;
	std::vector<int> ret(k + 1);
	int bit = 0;
	for (int i = 0; i < k; ++i) {
		ret[i] = sum >> i & 1;
		bit ^= ret[i];
	}
	ret[k] = bit;
	return ret;
}

std::vector<int> retrieve(std::vector<int> data) {
	const int n = data.size();
	const int k = n == 70 ? 6 : 8;
	const int m = n - k - 1;
	std::vector<int> ret(data.begin(), data.begin() + m);
	int sum = 0, bit = 0;
	for (int i = 0; i < k; ++i) {
		sum += data[m + i] << i;
		bit ^= data[m + i];
	}
	if (bit != data[m + k]) {
		return ret;
	}
	int actual = 0;
	for (int i = 0; i < m; ++i) {
		actual ^= data[i] * (i + 1);
	}
	if (actual == sum) {
		return ret;
	} else {
		ret[(actual ^ sum) - 1] ^= 1;
		return ret;
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...