Submission #1165500

#TimeUsernameProblemLanguageResultExecution timeMemory
1165500gustavo_dData Transfer (IOI19_transfer)C++20
100 / 100
87 ms1728 KiB
#include "transfer.h" #include <bits/stdc++.h> using namespace std; int calcXor(vector<int> &a, int l, int r) { int x = 0; for (int i=l; i<=r; i++) x ^= a[i]; return x; } vector<int> calculateXors(vector<int> &source) { int n = 1; while (n < (int)source.size()) n <<= 1; vector<int> tmp(n, 0); for (int i=0; i<(int)source.size(); i++) tmp[i] = source[i]; vector<int> bits; for (int b=0; (1 << b) < n; b++) { int Xor = 0; for (int i=0; i<n; i+=2*(1 << b)) { Xor ^= calcXor(tmp, i, i+(1 << b)-1); } bits.push_back(Xor); } reverse(bits.begin(), bits.end()); bits.push_back(calcXor(source, 0, (int)source.size() - 1)); return bits; } vector<int> get_attachment(vector<int> source) { return calculateXors(source); } vector<int> retrieve(vector<int> data) { // for (int d : data) cout << d << ' '; // cout << endl; int n; if ((int)data.size() <= 100) n = 63; else n = 255; vector<int> src(n); for (int i=0; i<n; i++) src[i] = data[i]; vector<int> bits; for (int i=n; i<(int)data.size()-1; i++) bits.push_back(data[i]); int checkerBit = data.back(); vector<int> expectedBits = calculateXors(src); int expectedChecker = expectedBits.back(); if (expectedChecker == checkerBit) { return src; } // corrompeu bits int l = 0, r = n-1; int pt = 0, ans = -1; while (l <= r) { int m = (l + r) / 2; if (bits[pt] != expectedBits[pt]) { r = m-1; ans = m; } else l = m+1; pt++; } if (ans != -1) src[ans] = !src[ans]; return src; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...