Submission #1313626

#TimeUsernameProblemLanguageResultExecution timeMemory
13136261otaMessage (IOI24_message)C++20
0 / 100
343 ms732 KiB
#include <bits/stdc++.h>
#include "message.h"
using namespace std;

// #define int long long
#define entire(x) (x).begin(), (x).end()

// vector<vector<bool>> hint;
// void send_packet (vector<bool> a) {
//     hint.push_back(a);
// }

void send_message(vector<bool> m, vector<bool> c){
    reverse(entire(m)); m.push_back(true);
    while ((int) m.size() < 1025) m.push_back(false);
    for (int i = 0; i < 31; i++) c[i] = !c[i];
    reverse(entire(m));

    int fg = 0;
    for (; c[fg] == false; fg++);

    int idx = 0;

    for (int bit = 0; bit < 31; bit++){
        if (bit == fg) continue;
        vector<bool> cur(31, false);
        cur[fg] = c[bit];
        for (int i = fg + 1; i < 31; i++) if (c[i]) cur[i] = m[idx++];
        send_packet(cur);
    }

    while (idx < 1025){
        vector<bool> cur(31, false);
        for (int i = fg; i < 31 and idx < 1025; i++) if (c[i]) cur[i] = m[idx++];
        send_packet(cur);
    } 

    int len = 0;
    // 1 +  2  + 4  + 8  + 16 = 31 !! 
    // 0 -> 1 -> 2 -> 3 -> 4
    for (; (1 << len) < fg; len++) fg -= (1 << len);

    for (int i = len-1; i > -1; i--){
        vector<bool> cur(31, false);
        if ((1 << i) & fg) fill(entire(cur), true);
        send_packet(cur);
    }
}

vector<bool> receive_message (vector<vector<bool>> r){
    // len would always be 66 or more
    int nr = (int) r.size(), len = nr - 66;
    int fg = (1 << len) - 1;
    for (int i = nr - 1; i > nr - 1 - len; i--){
        int cnt1 = count(entire(r[i]), true);
        if (cnt1 >= 16) fg += (1 << (nr - 1 - i));
    }
    
    vector<int> idx{fg};
    vector<bool> c(1025, false); c[fg] = true;
    for (int bit = 0; bit < 31; bit++){
        if (bit == fg) continue;
        c[bit] = r[bit - (bit > fg)][fg];
        if (c[bit]) idx.push_back(bit);
    }

    vector<bool> ans;
    for (int i = 0; i < 30; i++){
        for (int bit : idx) if (bit != fg){
            ans.push_back(r[i][bit]);
        }
    }

    for (int i = 30; i < 66; i++){
        for (int bit : idx) ans.push_back(r[i][bit]);
    } ans.pop_back();

    int fon = 0;
    for (; ans[fon] == false; fon++);

    vector<bool> actual;
    for (int i = fon + 1; i < (int) ans.size(); i++) actual.push_back(ans[i]);

    return actual;
}

// int32_t main(){
//     string cleo, message; cin >> cleo >> message;
//     int n = (int) message.size();
//     vector<bool> c(31), m(n);
//     for (int i = 0; i < 31; i++) c[i] = cleo[i] == '1';
//     for (int i = 0; i < n; i++) m[i] = message[i] == '1';

//     cout << "Cleo Hoe : ";
//     for (auto bit : c) cout << bit << " ";
//     cout << endl << "Message : ";
//     for (auto bit : m) cout << bit << " ";
//     cout << endl << "[END]" << endl;

//     send_message(m, c);

//     cout << endl;
//     vector<bool> found = receive_message(hint);
//     for (auto bit : found) cout << bit << " ";
//     cout << endl;
    
//     return 0;
// }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...