Pagini recente » Cod sursa (job #966085) | Cod sursa (job #1718106) | Cod sursa (job #1649415) | Cod sursa (job #1609246) | Cod sursa (job #2316997)
#include <cstdio>
using namespace std;
struct Trie
{
int ind;
Trie *fii[2];
Trie(){
ind=0;
fii[0]=NULL;
fii[1]=NULL;
}
};
Trie *root=new Trie;
int put2[25];
int xors[100005];
int rez,last;
void insert(Trie *nod, int val, int ind)
{
int i,x;
for(i=20; i>=0; i--){
x=val/put2[i];
if(nod->fii[x]==NULL)
nod->fii[x]=new Trie;
nod->ind=ind;
nod=nod->fii[x];
val%=put2[i];
}
}
int find(Trie *nod, int val)
{
int i,x;
for(i=20; i>=0; i--){
last=nod->ind;
x=val/put2[i];
if(nod->fii[1-x]==NULL)
nod=nod->fii[x];
else{
rez+=put2[i];
nod=nod->fii[1-x];
}
val=val%put2[i];
}
return last;
}
int main()
{ freopen("xormax.in", "r",stdin);
freopen("xormax.out", "w",stdout);
int n,i,x,ind,maxx=0,st,dr;
scanf("%d", &n);
put2[0]=1;
for(i=1; i<=21; i++)
put2[i]=2*put2[i-1];
for(i=1; i<=n; i++){
scanf("%d", &x);
xors[i]=xors[i-1]^x;
}
for(i=1; i<=n; i++){
insert(root, xors[i-1], i-1);
rez=0;
ind=find(root, xors[i]);
if(rez>maxx){
maxx=rez;
st=ind+1;
dr=i;
}
}
printf("%d %d %d", maxx, st, dr);
return 0;
}