# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1103253 | 2024-10-20T15:47:25 Z | Ahmed57 | 메시지 (IOI24_message) | C++17 | 0 ms | 0 KB |
#include <bits/stdc++.h> using namespace std; #define int long long void send_message(std::vector<bool> M, std::vector<bool> C){ vector<vector<bool>> v; for(int i = 0;i<64;i++){ v.push_back(vector<bool>(31,0)); } for(int i = 0;i<31;i++){ int la = -1; for(int j = 1;j<31;j++){ if(C[i]==C[(i+j)%31]){ la = j; break; } } for(int j = 0;j<la-1;j++){ v[j][i] = 0; } v[la-1][i] = 1; } int it = 0; for(int i = 0;i<31;i++){ int j = 0; while(v[j][i]==0){ j++; } j++; for(;j<64;j++){ if(it==M.size()){ v[j][i] = !M.back(); }else{ v[j][i] = M[it++]; } } } for(int i = 0;i<64;i++){ send_packet(v[i]); } } std::vector<bool> receive_message(std::vector<std::vector<bool>> R){ int nxt[31]; for(int i = 0;i<31;i++){ int j = 0; while(j<64&&R[i][j]==0)j++; j++; if(j<31){ nxt[i] = (i+j)%31; }else{ nxt[i] = -1; } } vector<int> ans; for(int i = 0;i<31;i++){ int x = i; vector<int> v = {i}; int sz = 1; while(nxt[x]!=i&&sz<40){ if(nxt[x]==-1){ sz = 40; } x = nxt[x]; v.push_back(x); sz++; } if(sz==16){ ans = v; } } sort(ans.begin(),ans.end()); vector<bool> M; for(auto i:ans){ int j = 0; while(R[j][i]==0)j++; j++; for(;j<64;j++){ M.push_back(R[j][i]); } } bool v = M.back(); while(M.back()==v)M.pop_back(); return M; }