Submission #1135504

#TimeUsernameProblemLanguageResultExecution timeMemory
1135504nguyentunglamMessage (IOI24_message)C++20
0 / 100
275 ms960 KiB
#include <vector> #include<bits/stdc++.h> using namespace std; std::vector<bool> send_packet(std::vector<bool> A); mt19937 rng(1); long long random(long long l, long long r) { return l + rng() % (r - l + 1); } int save[10010]; int p; void init() { int sum = 0; for (int i = 0; i < 1e4; i++) sum += save[i]; if (sum == 0) { for (int i = 0; i < 1e4; i++) save[i] = random(0, 1); } p = 0; } int get () { return save[p++]; } int inv[100][40]; int T = 20; vector<bool> _M; void send_message(std::vector<bool> M, std::vector<bool> C) { init(); int sz = M.size() - 1; for (int i = 0; i < 10; i++) M.insert(M.begin() + i, sz >> i & 1); // for (auto x : M) _M.push_back(x); vector<bool> hs(T); for (int i = 0; i < T; i++) hs[i] = get(); for (int i = 0; i < 100; i++) for (int j = 0; j <= 30; j++) inv[i][j] = get(); // for (auto x : hs) cout << x << " "; cout << endl; int free = 0; for (int i = 30; i >= 0; i--) if (C[i] == 0) free = i; int cnt = 0, send_cnt = 0; for (int j = 0; j < T; j++) { vector<bool> query(31); query[free] = hs[j]; for (int i = 0; i <= 30; i++) if (C[i] == 0 && i != free) { if (cnt < M.size()) query[i] = M[cnt++]; } for (int i = 0; i <= 30; i++) query[i] = query[i] ^ inv[send_cnt][i]; send_packet(query); send_cnt++; } // cout << free << endl; for (int j = free + 1; j <= 30; j++) { vector<bool> query(31); query[free] = C[j]; for (int i = 0; i <= 30; i++) if (C[i] == 0 && i != free) { if (cnt < M.size()) query[i] = M[cnt++]; } for (int i = 0; i <= 30; i++) query[i] = query[i] ^ inv[send_cnt][i]; send_packet(query); send_cnt++; } // _M = M; while (cnt < M.size()) { vector<bool> query(31); for (int i = 0; i <= 30; i++) if (C[i] == 0) { if (cnt < M.size()) query[i] = M[cnt++]; } for (int i = 0; i <= 30; i++) query[i] = query[i] ^ inv[send_cnt][i]; send_packet(query); send_cnt++; } } std::vector<bool> receive_message(std::vector<std::vector<bool>> R) { init(); vector<bool> hs(T); for (int i = 0; i < T; i++) hs[i] = get(); for (int i = 0; i < 100; i++) for (int j = 0; j <= 30; j++) inv[i][j] = get(); // for (auto x : hs) cout << x << " "; cout << endl; int free = 0; for (int i = 0; i <= 30; i++) { vector<bool> tmp; for (int j = 0; j < T; j++) tmp.push_back(R[j][i] ^ inv[j][i]); if (hs == tmp) free = i; } vector<bool> C(31); for (int j = 0; j <= 30; j++) { C[j] = R[j + T][free] ^ inv[j + T][free]; } vector<bool> ret; for (int j = 0; j < R.size(); j++) { for (int i = 0; i <= 30; i++) if (C[i] == 0) { if (i == free && j <= 30 + T) continue; ret.emplace_back(R[j][i] ^ inv[j][i]); // if (ret[ret.size() - 1] != _M[ret.size() - 1]) { // cout << j << " " << i << " "; // exit(0); // } } } int sz = 0; for (int i = 0; i < 10; i++) if (ret[i]) sz |= (1 << i); sz++; vector<bool> _ret; for (int i = 10; i < 10 + sz; i++) _ret.push_back(ret[i]); return _ret; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...