#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int B = 30;
const int N = 250123;
int trie[N * B][2], id;
int max_index[N * B], lower;
void insert(int x, int index, int i = B - 1, int v = 0) {
if (i == -1) return void(max_index[v] = index);
int b = (x >> i) & 1;
if (!trie[v][b]) trie[v][b] = ++id;
int u = trie[v][b];
insert(x, index, i - 1, u);
max_index[v] = max(max_index[v], max_index[u]);
}
int query(int x) {
int number_so_far = 0, v = 0, res = -1;
for (int i = B - 1; i >= 0; --i) {
int b = (x >> i) & 1;
int b2 = (lower >> i) & 1;
if (b2) {
if (!trie[v][1 - b]) return res;
number_so_far ^= (1 << i);
v = trie[v][1 - b];
} else {
if (trie[v][1 - b]) {
res = max(res, max_index[trie[v][1 - b]]);
if (!trie[v][b]) return res;
}
assert(trie[v][b]);
v = trie[v][b];
}
}
assert(number_so_far == lower);
return max(res, max_index[v]);
}
int p[N], n;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> lower;
for (int i = 1; i <= n; i++) cin >> p[i];
for (int i = n; i >= 1; --i) p[i] ^= p[i + 1];
insert(0, n + 1);
int best = -1, max_interval = 0;
for (int i = n; i >= 1; --i) {
int k = query(p[i]) - i;
if (k >= max_interval) {
max_interval = k;
best = i;
}
insert(p[i], i);
}
cout << best << " " << max_interval << "\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |