#include "message.h"
#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int rand(int l , int r){
return rng() % (r-l+1) + l;
}
long long decipher = 0;
long long cur = 120397273ll;
long long sabit = 893721095ll;
const long long mod = 1e9 + 7;
void init(){
decipher = 0;
cur = 120397273ll;
sabit = 893721095ll;
}
int nxt(){
cur = (cur * decipher + sabit) % mod;
decipher = (decipher * sabit) % mod;
sabit = (sabit + decipher) % mod;
return cur & 1;
}
void send_message(vector<bool> M, vector<bool> C) {
init();
// decipheri belirle
vector<bool>vec(31,0);
for(int i = 0;i<31;i++)vec[i] = rand(0,1);
vector<bool>v1 = send_packet(vec);
decipher = 0;
for(int i = 0;i<31;i++){
if(v1[i]){
decipher += 1ll << i;
}
}
// kleopatralari bul
int kleosayac = 0 , patladi[31] = {0};
while(kleosayac < 15){
vec.assign(31,0);
int yolla[31];
for(int j = 0;j<31;j++){
yolla[j] = nxt();
if(C[j] == 0){
vec[j] = yolla[j];
}
else{
vec[j] = rand(0,1);
}
}
vector<bool>dondu = send_packet(vec);
for(int j = 0;j<31;j++){
if(C[j] == 1 and patladi[j] == 0 and dondu[j] != yolla[j]){
kleosayac++;
patladi[j] = 1;
}
}
}
vec.assign(31,0);
M.push_back(1);
// mesaji yolla
int sayac = 0;
for(int i = 0;i<(int)M.size();i++){
while(C[sayac]){
sayac = (sayac + 1) % 31;
if(sayac == 0){
send_packet(vec);
vec.assign(31,0);
}
}
vec[sayac] = M[i];
sayac = (sayac + 1) % 31;
if(sayac == 0){
send_packet(vec);
vec.assign(31,0);
}
}
if(sayac != 0){
send_packet(vec);
vec.assign(31,0);
}
}
vector<bool> receive_message(vector<vector<bool>> R) {
init();
// decipheri bul
for(int i = 0;i<31;i++){
if(R[0][i]){
decipher += 1ll << i;
}
}
// kleopatralari bul
vector<bool>cleo(31,0);
int mindx = 1;
while(count(cleo.begin() , cleo.end() ,1) < 15){
for(int j = 0;j<31;j++){
if(R[mindx][j] != nxt()){
cleo[j] = 1;
}
}
mindx++;
}
// mesaji bul
int sayac = 0;
vector<bool>ret;
while(mindx < R.size()){
while(cleo[sayac]){
sayac = (sayac + 1) % 31;
if(sayac == 0)mindx++;
if(mindx == R.size())break;
}
if(mindx == R.size())break;
ret.push_back(R[mindx][sayac]);
sayac = (sayac + 1) % 31;
if(sayac == 0)mindx++;
}
while(!ret.empty() and ret.back() == 0)ret.pop_back();
ret.pop_back();
return ret;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |