Pagini recente » Cod sursa (job #1882333) | Cod sursa (job #2484128) | Cod sursa (job #3287826) | Cod sursa (job #396459) | Cod sursa (job #3230351)
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("fast-math")
#include<bits/stdc++.h>
#define inf 0x3f3f3f
using namespace std;
const int dim = 1e5 + 5;
const int bitu = 20;
int v[dim], sp[dim], n, maxi = -1, st, dr, sum;
struct trie
{
int sol;
trie* node[2];
trie()
{
node[0] = node[1] = NULL;
sol = 0;
}
};
void add(int idx, trie*nod, int val)
{
// adaug in trie bitii lui sp[i]
for(int j = bitu; j >= 0; --j)
{
int nr = ((val >> j) & 1);
if(nod->node[nr] == NULL)
{
nod->node[nr] = new trie;
}
nod = nod->node[nr];
}
nod->sol = idx;
}
int solve(int val, trie *nod)
{
for(int j = bitu; j >=0 ; --j)
{
int nr = ((val >> j) & 1);
if(nod->node[1 - nr] != NULL)
{
nod = nod->node[1- nr];
}
else
{
nod = nod->node[nr];
}
}
return nod->sol;
}
trie*x;
ifstream fin("xormax.in");
ofstream fout("xormax.out");
int32_t main(int argc, char * argv[])
{
fin >> n;
x = new trie;
add(0, x, 0);
for(int i = 1; i <= n; ++i)
{
fin >> v[i];
sp[i] = (sp[i - 1] ^ v[i]);
}
for(int i = 1; i <= n; ++i)
{
int vo = solve(sp[i], x);
if((sp[i] ^ sp[vo]) > maxi)
{
st = vo + 1;
dr = i;
maxi = (sp[i] ^ sp[vo]);
}
add(i, x, sp[i]);
}
fout << maxi << " " << st << " " << dr;
return 0;
}