Submission #1271548

#TimeUsernameProblemLanguageResultExecution timeMemory
1271548ashishlimitlessXOR (IZhO12_xor)C++20
100 / 100
118 ms56552 KiB
#pragma GCC optimize ("O3")
#pragma GCC optimize ("unroll-loops")

#include <bits/stdc++.h>
using namespace std;

using LL = long long;

const int B = 30; // bit length

struct TrieNode {
    TrieNode* nxt[2];
    int minIdx;
    TrieNode() {
        nxt[0] = nxt[1] = nullptr;
        minIdx = INT_MAX;
    }
};

struct Trie {
    TrieNode* root;
    Trie() { root = new TrieNode(); }

    void insert(int val, int idx) {
        TrieNode* cur = root;
        for (int bit = B - 1; bit >= 0; bit--) {
            int b = (val >> bit) & 1;
            if (!cur->nxt[b]) cur->nxt[b] = new TrieNode();
            cur = cur->nxt[b];
            cur->minIdx = min(cur->minIdx, idx);
        }
    }

    int query(int x, int k) {
        TrieNode* cur = root;
        int ans = INT_MAX;
        for (int bit = B - 1; bit >= 0; bit--) {
            if (!cur) break;
            int xb = (x >> bit) & 1;
            int kb = (k >> bit) & 1;
            if (!kb) {
                if (cur->nxt[xb ^ 1]) ans = min(ans, cur->nxt[xb ^ 1]->minIdx);
                cur = cur->nxt[xb];
            } else {
                cur = cur->nxt[xb ^ 1];
            }
        }
        if (cur) ans = min(ans, cur->minIdx);
        return ans;
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, k;
    cin >> n >> k;

    Trie trie;
    int pref = 0;
    trie.insert(pref, 0);

    int ans = 0, ans_id = -1;
    for (int i = 1, x; i <= n; i++) {
        cin >> x;
        pref ^= x;
        int idx = trie.query(pref, k);
        if (idx != INT_MAX) {
            if (i - idx > ans) ans = i - idx, ans_id = idx;
            else if (i - idx == ans) ans_id = min(ans_id, idx);
        }
        trie.insert(pref, i);
    }

    cout << ++ans_id << ' ' << ans << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...