Submission #1179099

#TimeUsernameProblemLanguageResultExecution timeMemory
1179099qrnXOR (IZhO12_xor)C++20
100 / 100
155 ms60556 KiB
#include <bits/stdc++.h>
using namespace std;

#define SPEED ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL);
#define pb push_back
#define fi first
#define se second

#define endl "\n"
#define ALL(x) x.begin(), x.end()
#define sz(x) x.size()
#define intt long long

const intt mod = 1e9 + 7;
const intt inf = 1e18;
const intt mxN = 2e5 + 5;

struct trie {
    trie *kids[2];  
    intt idx; // bu Node-a catan ilk pref indexi

    trie () {
        kids[0] = 0;
        kids[1] = 0;
        idx = inf;
    }
};

void add(trie *& root, intt X, intt idxi) {
    trie *node = root;
    for(intt i = 30; i >= 0; i--) {
        intt bit = ((1 << i) & X) > 0;
        if(node->kids[bit] == 0){
            node->kids[bit] = new trie();
        }
        node = node->kids[bit]; 
        node->idx = min(node->idx, idxi);
    }
}

intt get(trie *& root, intt x, intt k) {
    trie *curr = root;
    intt ret = 2 * inf;
    for (intt bit = 30; bit >= 0; bit--) {
        intt numbit = (x >> bit) & 1;
        intt Xbit = (k >> bit) & 1;

        if (numbit == 1) {
            if (Xbit == 1) {
                if (curr->kids[0]) {
                    if (bit == 0) ret = min(ret, curr->kids[0]->idx);
                    curr = curr->kids[0];
                } else {
                    return ret;
                }
            } else {
                if (curr->kids[0]) ret = min(ret, curr->kids[0]->idx);

                if (curr->kids[1]) {
                    if (bit == 0) ret = min(ret, curr->kids[1]->idx);
                    curr = curr->kids[1];
                } else {
                    return ret;
                }
            }
        } else {
            if (Xbit == 1) {
                if (curr->kids[1]) {
                    if (bit == 0) ret = min(ret, curr->kids[1]->idx);
                    curr = curr->kids[1];
                } else {
                    return ret;
                }
            } else {
                if (curr->kids[1]) ret = min(ret, curr->kids[1]->idx);

                if (curr->kids[0]) {
                    if (bit == 0) ret = min(ret, curr->kids[0]->idx);
                    curr = curr->kids[0];
                } else {
                    return ret;
                }
            }
        }
    }
    return ret;
}



void solve() {
    intt N, X;
    cin >> N >> X;
    
    vector<intt> A(N+1), pref(N+1);
    for(intt i = 1; i <= N; i++) cin >> A[i];
    A[0] = pref[0] = 0;

    for(intt i = 1; i <= N; i++) {
        pref[i] = A[i];
        if(i) pref[i] ^= pref[i-1];
    }
    trie *root = new trie();

    intt l = 0, k = 0, diff = 0;
    for(intt i = 0; i <= N; i++) {
        intt for_l = get(root, pref[i], X) + 1;
        if(for_l < inf + 10 && diff < i - for_l + 1) {
            diff = i - for_l + 1;
            l = for_l;
        } else if(diff == i - for_l + 1 && for_l < l) {
            l = for_l;
        }
        add(root, pref[i], i);
    }
    cout << l << " " << diff << endl;
}

signed main() {
    SPEED;
    intt tst = 1;
    // cin >> tst;
    while (tst--) {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...