Pagini recente » Cod sursa (job #3200709) | Cod sursa (job #3241863) | Istoria paginii runda/moisil2016-1112 | Cod sursa (job #751652) | Cod sursa (job #3294778)
#include <bits/stdc++.h>
using namespace std;
ifstream f("xormax.in");
ofstream g("xormax.out");
const int MAX_DIM = 100000;
const int MAX_LOG_2 = 21;
int a[MAX_DIM + 1];
int n, sum, maxSum;
int st, dr;
struct Node {
int bit = 0, val = 0, idx = 0;
Node *next[2] = {};
} *root, *crt, *sol;
void insert(int val, int pos) {
crt = root;
for (int bit = MAX_LOG_2; bit >= 0; bit--) {
int id = ((val & (1 << bit)) >> bit);
if (crt->next[id] == nullptr) {
crt->next[id] = new Node;
crt->next[id]->bit = id;
}
crt = crt->next[id];
}
crt->val = val;
crt->idx = pos;
}
Node *find(int val) {
crt = root;
for (int bit = MAX_LOG_2; bit >= 0; bit--) {
int id = ((val & (1 << bit)) >> bit);
if (crt->next[id ^ 1] != nullptr)
crt = crt->next[id ^ 1];
else
crt = crt->next[id];
}
return crt;
}
int main() {
f >> n;
for (int i = 1; i <= n; i++)
f >> a[i];
root = new Node;
sum = maxSum = 0;
st = dr = 0;
for (int i = 1; i <= n; i++) {
insert(sum, i);
sum ^= a[i];
sol = find(sum);
if ((sum ^ sol->val) > maxSum) {
maxSum = (sum ^ sol->val);
st = sol->idx;
dr = i;
}
}
g << maxSum << " " << st << " " << dr;
f.close();
g.close();
return 0;
}