Submission #1224078

#TimeUsernameProblemLanguageResultExecution timeMemory
1224078nicolo_010Message (IOI24_message)C++20
83.31 / 100
411 ms872 KiB
#include "message.h"
#include <bits/stdc++.h>
using namespace std;
template <typename T>
using v = vector<T>;
#define rep(i, k, n) for (int i =k; i < n; i++)
using ll = long long;
using pii = pair<int, int>;

void send_message(std::vector<bool> M, std::vector<bool> C) {
    v<int> bits;
    rep(i, 0, 31) {
      if (!C[i]) bits.push_back(i);
    }
    v<v<bool>> pack(5, v<bool>(31, false));
    rep(i, 0, 16) {
      int now = bits[(i+1)%16];
      int j = 0;
      //cout << i << endl;
      rep(j, 0, 5) {
        if (now&1) pack[j][bits[i]] = true;
        else pack[j][bits[i]] = false;
        now /= 2;
      }
    }
    rep(i, 0, 5) {
      send_packet(pack[i]);
    }
    //for (auto x : M) cout << x << " ";
    //cout << endl;
    v<bool> lg(31, false);
    int k = M.size();
    //cout << k << endl;
    rep(i, 0, 31) {
        if (C[i] == 1) continue;
        //cout << (k&1) << " " << k << endl;
        if (k&1) lg[i] = true;
        k /= 2;
    }
    send_packet(lg);
    int l = 0;
    rep(i, 0, (int)M.size()) {
        if (l == (int)M.size()) break;
        v<bool> A(31, false);
        rep(j, 0, 31) {
            if (l == (int)M.size()) break;
            if (C[j]) continue;
            A[j] = M[l];
            l++;
        }
        send_packet(A);
    }

}

v<int> par;
v<int> anterior;
v<int> vis;
v<int> cont;

void dfs(int n) {
    vis[n] = 1;
    //cout << n << endl;
    int u = par[n];
    if (vis[u] == 1) {
        anterior[u] = n;
        v<int> cycle;
        while (anterior[u] != par[n]) {
          cycle.push_back(anterior[u]);
          u = anterior[u];
        }
        cycle.push_back(par[n]);
        if ((int)cycle.size() == 16) {
          cont = cycle;
          vis[n] = 2;
          return;
        }
    }
    else if (vis[u] == 0) {
        anterior[u] = n;
        dfs(u);
    }
    vis[n] = 2;
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
    par.resize(31);
    anterior.assign(31, -1);
    vis.assign(31, 0);
    cont.resize(6);
    v<bool> C(31, true);
    rep(i, 0, 31) {
        int n = 0;
        rep(j, 0, 5) {
          if (R[j][i] == 1) n += (1 << j);
        }
        par[i] = n;
    }   
    rep(i, 0, 31) {
      if (vis[i] == 0) dfs(i);
    } 
    for (auto x : cont) {
      //cout << x << endl;
      C[x] = false;
    }
    //for (auto x : C) cout << x << " "; cout << endl;
    int n = 0;
    int b = 0;
    //cout << endl;
    v<bool> aux = R[5];
    //for (auto x : aux) cout << x << " "; cout << endl;
    rep(i, 0, 31) {
      if (C[i]) continue;
      if (aux[i]) n += (1 << b);
      b++;
    }
    //cout << n << endl;
    //cout << n << endl;
    v<bool> message(n);
    int l = 0;
    rep(i, 6, (int)R.size()) {
        if (l == n) break;
        rep(j, 0, 31) {
            //cout << R[i][j] << " ";
            if (l == n) break;
            if (C[j]) continue;
            message[l] = R[i][j];
            l++;
        }
        //cout << endl;
    }
    return message;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...