#include <bits/stdc++.h>
using namespace std;
#define pii array<int,2>
struct Node {
    pii cld = {-1, -1};
    vector<int> ind;
};
Node root;
vector<Node> trie = {root};
void insert(int val, int id) {
    int idx = 0;
    trie[0].ind.push_back(id);
    for (int i=30;i>=0;i--) {
        int b1 = 0;
        if (((1<<i)&val) != 0) b1 = 1;
        if (trie[idx].cld[b1] == -1) {
            Node n1;
            trie[idx].cld[b1] = (int)trie.size();
            trie.push_back(n1);
        }
        idx = trie[idx].cld[b1];
        trie[idx].ind.push_back(id);
    }
}
int find_min(int val, int k) {
    int idx = 0;
    int res = 1e9;
    for (int i=30;i>=0;i--) {
        if (((1<<i)&k) != 0) {
            int b1 = 1;
            if (((1<<i)&val) != 0) b1 = 0;
            if (trie[idx].cld[b1] == -1) return res;
            idx = trie[idx].cld[b1];
        }
        else {
            int b1 = 0;
            if (((1<<i)&val) != 0) b1 = 1;
            if (trie[idx].cld[1-b1] != -1 && trie[trie[idx].cld[1-b1]].ind.size()) res = min(res, trie[trie[idx].cld[1-b1]].ind[0]);
            if (trie[idx].cld[b1] == -1) return res;
            idx = trie[idx].cld[b1];
        }
    }
    if (trie[idx].ind.size()) res = min(res, trie[idx].ind[0]);
    return res;
}
signed main() {
    int n,k;cin>>n>>k;
    vector<int> a(n);
    for (auto &x:a)cin>>x;
    vector<int> p(n, 0);
    p[0] = a[0];
    for (int i=1;i<n;i++) {
        p[i] = (p[i-1] ^ a[i]);
    }
    insert(0, -1);
    int mxDis = -1, mnI = -1;
    for (int i=0;i<n;i++) {
        int mn = find_min(p[i], k);
        if (i - mn > mxDis) {
            mxDis = i-mn;
            mnI = mn;
        }
        else if (i - mn == mxDis) {
            mnI = min(mnI, mn);
        }
        insert(p[i], i);
    }
    cout << mnI+2 << " " << mxDis << endl;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |