Submission #1317169

#TimeUsernameProblemLanguageResultExecution timeMemory
1317169spetrMessage (IOI24_message)C++20
0 / 100
362 ms796 KiB
#include <bits/stdc++.h>
#include "message.h"
using namespace std;

#define ll long long
const ll mmod = 998244353;
#define vl vector<long long>
#define vll vector<vector<long long>>
#define pl pair<long long, long long>
#define vb vector<bool>

void send_message(std::vector<bool> M, std::vector<bool> C){
    reverse(M.begin(), M.end());
    M.push_back(1);
    while (M.size() < 1025){
        M.push_back(0);
    }
    reverse(M.begin(), M.end());
    vector<vector<bool>> packets(66, vector<bool> (31, 0));

    vl depth(31, 0);
    for (ll i = 0; i < 31; i++){
        ll j = 1;
        if (!C[i]){ // Změna: Zapisujeme jen do bezpečných bitů
            while (C[(i+j)%31] == true){ // Změna: Hledáme další bezpečný (přeskakujeme true)
                j++;
            }
            packets[j-1][i] = 1;
            depth[i] = j;
        }
    }
    ll p = 0;
    for (ll i = 0; i < 31; i++){
        if (!C[i]){ // Změna: Zapisujeme jen do bezpečných bitů
            for (ll j = depth[i]; j < 66; j++){
                if (p < M.size()) { // Kontrola mezí
                    packets[j][i] = M[p];
                    p++;
                }
            }
        }
    }

    for (ll i = 0; i < 66; i++){
        send_packet(packets[i]);
    }
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> R){
    vl pointer(31, -1);
    vl depth(31, 0);
    for (ll i = 0; i < 31; i++){
        for (ll j = 0; j < 66; j++){
            if (R[j][i]){
                if (pointer[i] == -1){
                    pointer[i] = (i+j+1)%31;
                    depth[i] = j+1;
                }
            }
        }
    }

    // Fallback pro poškozené bity, aby se algoritmus nezasekl
    for (ll i = 0; i < 31; i++){if (pointer[i] == -1) pointer[i] = (i+1)%31;}

    set<ll> c;
    for (ll i = 0; i < 31; i++){
        c.clear();
        ll pos = i;
        // Hledáme cyklus bezpečných bitů (délka >= 16)
        for (ll j = 0; j < 32; j++){ // Zvýšen limit pro jistotu
            c.insert(pos);
            pos = pointer[pos];
        }
        if (pos == pointer[pos] || c.size() >= 16){ // Heuristika pro nalezení cyklu
             // Pokud jsme našli dostatečně velkou množinu, která se točí v kruhu
             if(c.size() >= 16) break;
        }
    }
    
    // Pokud cyklus selhal (nemělo by nastat u správného řešení), fallback
    if (c.size() < 16) {
        c.clear();
        for(int i=0; i<16; ++i) c.insert(i); 
    }

    vector<bool> m;
    for (auto x: c){
        for (ll i = depth[x]; i < 66; i++){
            m.push_back(R[i][x]);
        }
    }
    
    vector<bool> M;
    ll p = 0;
    while (p < m.size() && m[p] == 0){
        p++;
    }
    p++;
    // Změna: Čteme dokud nemáme 1025 bitů nebo nedojdou data
    for (ll i = p; M.size() < 1025 && i < m.size(); i++){
        M.push_back(m[i]);
    }
    // Doplnění nulami, pokud je zpráva kratší (safety net)
    while(M.size() < 1025) M.push_back(0);
    
    return M;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...