# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|
1178768 | | qrn | XOR (IZhO12_xor) | C++20 | | 2 ms | 3392 KiB |
#include <bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
using namespace std;
// using namespace __gnu_pbds;
// template<class T>
// using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
#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;
vector<intt> A(mxN), pref(mxN);
struct trie {
trie* left;
trie *right;
set<intt> idx;
intt data;
trie () {
left = nullptr;
right = nullptr;
idx.clear();
data = -1;
}
};
void add(trie *& root, intt X, intt idxi) {
trie *node = root;
for(intt bit = 30; bit >= 0; bit--) {
node->data = ((1 << bit) & X);
if((1 << bit) & X) {
if(node->right == nullptr) {
node->right = new trie();
}
node->idx.insert(idxi);
node = node->right;
} else {
if(node->left == nullptr) {
node->left = new trie();
}
node->idx.insert(idxi);
node = node->left;
}
}
}
intt get(trie *& root, intt X, intt num) {
intt ret = inf;
trie *node = root;
for(intt i = 30; i >= 0; i--) {
intt numbit = (((1 << i) & num) > 0);
if(((1 << i) & X) == 0) {
if(numbit == 0) {
if(node->right != nullptr) {
if(num == 1) cout << i << endl;
return *node->idx.begin();
} else {
if(node->idx.size() > 0) ret = min(ret, *node->idx.begin());
node = node->left;
}
} else {
if(node->left != nullptr) {
// if(num == 1) cout << i << endl;
return *node->idx.begin();
} else {
if(node->idx.size() > 0) ret = min(ret, *node->idx.begin());
node = node->right;
}
}
} else {
if(numbit == 1) {
if(node->left == nullptr) {
return -1;
} else {
if(node->idx.size() > 0) ret = min(ret, *node->idx.begin());
node = node->left;
}
} else {
if(node->right == nullptr) {
return -1;
} else {
if(node->idx.size() > 0) ret = min(ret, *node->idx.begin());
node = node->right;
}
}
}
}
return ret;
}
void solve() {
intt N, x;
cin >> N >> x;
A.resize(N);
for(auto &a : A) cin >> a;
trie *root = new trie();
pref.resize(N);
for(intt i = 0; i < N; i++) {
pref[i] = A[i];
if(i) pref[i] ^= pref[i-1];
}
// for(intt i : pref) cout << i << " ";
// cout << endl;
intt diff = 0, l = 0, r = 0;
add(root, pref[0], 0);
for(intt i = 1; i < N; i++) {
intt for_l = get(root, x, pref[i]);
// cout << i << ": " << for_l << endl;
if(for_l == -1) continue;
if(i - for_l > diff) {
r = i + 1;
l = for_l + 1;
diff = i - for_l;
}
add(root, pref[i], i);
}
l++;
cout << l << " " << r-l+1 << endl;
}
signed main() {
SPEED;
intt tst = 1;
// cin >> tst;
while (tst--) {
solve();
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |