제출 #261475

#제출 시각아이디문제언어결과실행 시간메모리
261475themax23Data Transfer (IOI19_transfer)C++17
100 / 100
245 ms2884 KiB
#include "transfer.h" #include <bits/stdc++.h> using namespace std; std::vector<int> get_attachment(std::vector<int> source) { int t = 0, n = (int)source.size(); if(n == 63) t = 6; //log2(63) else t = 8; //log2(255) vector<int> attachment; int k = n+1; for(int i = 0; i < t; ++i){ int checkbit = 0; for(int start_idx = 0; start_idx < n; start_idx += k){ for(int idx = 0; idx < k/2; ++idx){ checkbit ^= source[start_idx + idx]; } } k /= 2; attachment.push_back(checkbit); } int attachment_bit = 0; for(int it : attachment) attachment_bit ^= it; attachment.push_back(attachment_bit); return attachment; } std::vector<int> retrieve(std::vector<int> data) { int check, N, K; check = (int)data.size(); if(check == 70) {N = 63; K = 7;} else {N = 255; K = 9;} vector<int> src; for(int j = 0; j < N; ++j) src.push_back(data[j]); int fcbit = 0; for(int i = N; i < N+K-1; ++i) fcbit ^= data[i]; if(fcbit != data[N+K-1]) return src; int k = N+1, t = K-1; string find = ""; for(int i = 0; i < t; ++i){ int checkbit = 0; for(int start_idx = 0; start_idx < N; start_idx += k){ for(int idx = 0; idx < k/2; ++idx){ checkbit ^= data[start_idx + idx]; } } k /= 2; if(checkbit == data[N+i]) find += "R"; else find += "L"; } int err_idx = 0; int f = (N+1) / 2; for(char x : find){ if(x == 'R') err_idx += f; f /=2; } //if(err_idx == N) err_idx = N-1; src[err_idx] ^= 1; return src; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...