Submission #1229344

#TimeUsernameProblemLanguageResultExecution timeMemory
1229344dostsData Transfer (IOI19_transfer)C++20
100 / 100
65 ms1728 KiB
#include "transfer.h"
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
//#define int long long
#define pii pair<int,int>
#define vi vector<int>
#define ff first
#define ss second
#define sp << " " <<
#define all(x) x.begin(),x.end()
#define big(x) ((int)(x.size()))
using namespace std;
const int MOD = 1e9+7, LIM = 1e6+1, inf = 2e9;

std::vector<int> get_attachment(std::vector<int> source) {
	//msg, bitinfo, 
	//hangilerinde sorun var? birden fazla varsa gg
	//tam olarak birinde varsa ya (1<<problem) ya da problemxor sorunlu, todos'a göre
	int ln = __lg(big(source)+1);
	vi extras(ln,0);
	int also = 0;
	for (int i = 0;i<big(source);i++) {
		also^=source[i];
		for (int j = 0;j<ln;j++) {
			if ((i+1)&(1<<j)) extras[j]^=source[i];
		}
	}
	extras.push_back(also);
	return extras;
}

std::vector<int> retrieve(std::vector<int> data) {
	//n+lg(n)+1
	int n,ln;
	if (big(data) == 255+8+1) {
		n = 255,ln = 8;
	}else n = 63,ln = 6;
	int shit = 0;
	for (int i = 0;i<ln;i++) {
		int trust = 0;
		for (int j = 0;j<n;j++) {
			if ((j+1)&(1<<i)) trust^=data[j];
		}
		if (trust != data[n+i]) shit|=(1<<i);
	}
	if (__builtin_popcountll(shit) >= 2) {
		data[shit-1]^=1;
		return vi(data.begin(),data.begin()+n);
	}
	else if (__builtin_popcountll(shit) == 1) {
		int realpc = 0;
		for (int i = 0;i<n;i++) realpc^=data[i];
		if (realpc != data.back()) data[shit-1]^=1;
		return vi(data.begin(),data.begin()+n);
	}
	else return vi(data.begin(),data.begin()+n);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...