Submission #829611

#TimeUsernameProblemLanguageResultExecution timeMemory
829611BlagojData Transfer (IOI19_transfer)C++17
100 / 100
154 ms2496 KiB
#include <bits/stdc++.h>
#include "transfer.h"
// #include "grader.cpp"

using namespace std;

vector<int> get_attachment(vector<int> source) {
	int n = source.size();
	vector<int> extra;
	for (int i = 0; i < (n == 63 ? 6 : 8); i++) {
		int sum = 0;
		for (int j = 1; j <= n; j++) {
			if (j & (1 << i)) {
				sum ^= source[j - 1];
			}
		}
		extra.push_back(sum);
	}
	int last = 0;
	for (auto x : extra) last ^= x;
	extra.push_back(last);
	return {extra};
}

vector<int> retrieve(vector<int> data) {
	vector<int> extra;
	for (int i = data.size() - 1; (i > 62 && i <= 70) || (i > 254 && i <= 300); i--) extra.push_back(data[i]);
	reverse(extra.begin(), extra.end());
	int Xor = 0;
	for (int i = 0; i < extra.size() - 1; i++) Xor ^= extra[i];
	int sz = extra.size();
	while (sz--) data.pop_back();
	if (Xor != extra.back()) return data;
	int num = 0;
	for (int i = 0; i < (data.size() == 63 ? 6 : 8); i++) {
		int sum = 0;
		for (int j = 1; j <= data.size(); j++) {
			if (j & (1 << i)) {
				sum ^= data[j - 1];
			}
		}
		num |= (1 << i) * sum;
	}
	int cur = 0;
	for (int i = 0; i < extra.size() - 1; i++) cur |= (1 << i) * extra[i];
	int pos = num ^ cur;
	if (pos != 0) data[pos - 1] = !data[pos - 1];
	return data;
}

Compilation message (stderr)

transfer.cpp: In function 'std::vector<int> retrieve(std::vector<int>)':
transfer.cpp:30:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   30 |  for (int i = 0; i < extra.size() - 1; i++) Xor ^= extra[i];
      |                  ~~^~~~~~~~~~~~~~~~~~
transfer.cpp:37:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   37 |   for (int j = 1; j <= data.size(); j++) {
      |                   ~~^~~~~~~~~~~~~~
transfer.cpp:45:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |  for (int i = 0; i < extra.size() - 1; i++) cur |= (1 << i) * extra[i];
      |                  ~~^~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...