Submission #1132247

#TimeUsernameProblemLanguageResultExecution timeMemory
1132247totoroData Transfer (IOI19_transfer)C++20
0 / 100
5 ms1724 KiB
#include "transfer.h" #include <vector> #include <iostream> #include <cassert> std::vector<int> get_attachment(std::vector<int> source) { std::vector<int> res; for (int i = 0; (1 << i) < source.size(); ++i) { int xorsum = 0; for (int j = 0; j < source.size(); ++j) { if (((j >> i) & 1) == 0) continue; xorsum ^= source[j]; } res.push_back(xorsum); } int parity = 0; for (int i : res) parity ^= i; res.push_back(parity); return res; } int log2(int n) { int log = 0; while (n) ++log, n >>= 1; return log; } std::vector<int> retrieve(std::vector<int> data) { int parity = data.back(); data.pop_back(); int extra = log2(data.size()); while (log2(data.size() - extra) < extra) --extra; // std::cout << extra << std::endl; // for (auto el : data) std::cout << el; // std::cout << std::endl; int bad = 0; for (int i = 0; i < extra; ++i) { int xorsum = data[data.size() - extra + i]; // std::cout << "INFO: " << xorsum << std::endl; for (int j = 0; j < data.size() - extra; ++j) { if (((j >> i) & 1) == 0) continue; xorsum ^= data[j]; // std::cout << "INFOOO: " << xorsum << std::endl; } assert(xorsum <= 1); bad ^= xorsum << i; } for (int i = data.size() - extra; i < data.size(); ++i) { parity ^= data[i]; } if (parity) bad = -1; for (int i = 0; i < data.size(); ++i) { data[i] ^= i==bad; } // std::cout << bad << std::endl; std::vector<int> res; for (int i = 0; i < data.size() - extra; ++i) { res.push_back(data[i]); } return res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...