#include <bits/stdc++.h>
using namespace std;
/* ==== BinaryTrie template (زي ما بعته) ==== */
struct TrieNode {
TrieNode* child[2];
int cnt;
TrieNode() {
child[0] = child[1] = nullptr;
cnt = 0;
}
};
class BinaryTrie {
public:
static const int MAXB = 31;
TrieNode* root;
BinaryTrie() {
root = new TrieNode();
}
void insert(int x, int delta = 1) {
TrieNode* cur = root;
cur->cnt += delta;
for (int b = MAXB; b >= 0; b--) {
int bit = (x >> b) & 1;
if (!cur->child[bit])
cur->child[bit] = new TrieNode();
cur = cur->child[bit];
cur->cnt += delta;
}
}
long long countXorLessThan(int x, int k) {
TrieNode* cur = root;
long long res = 0;
for (int b = MAXB; b >= 0; b--) {
if (!cur) break;
int xb = (x >> b) & 1;
int kb = (k >> b) & 1;
if (kb == 1) {
if (cur->child[xb])
res += cur->child[xb]->cnt;
cur = cur->child[1 - xb];
} else {
cur = cur->child[xb];
}
}
return res;
}
long long countXorGreaterThan(int x, int k) {
long long total = root->cnt;
long long less = countXorLessThan(x, k + 1);
return total - less;
}
};
/* ======================================== */
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
int X;
cin >> N >> X;
vector<int> a(N + 1), px(N + 1);
for (int i = 1; i <= N; i++)
cin >> a[i];
px[0] = 0;
for (int i = 1; i <= N; i++)
px[i] = px[i - 1] ^ a[i];
BinaryTrie trie;
int l = 1;
int bestLen = 0, bestI = 1;
trie.insert(px[0], 1);
for (int r = 1; r <= N; r++) {
// حاول تقلل l لحد ما يبقى فيه حل
while (l <= r &&
trie.countXorGreaterThan(px[r], X - 1) == 0) {
trie.insert(px[l - 1], -1);
l++;
}
if (l <= r) {
int len = r - l + 1;
if (len > bestLen) {
bestLen = len;
bestI = l;
}
}
trie.insert(px[r], 1);
}
cout << bestI << " " << bestLen << "\n";
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |