Pagini recente » Cod sursa (job #3284230) | Cod sursa (job #2893218) | Cod sursa (job #1716792) | Cod sursa (job #131952) | Cod sursa (job #1014506)
#include<stdio.h>
#define fin "xormax.in"
#define fout "xormax.out"
#define Nmax 5000000
#define Bmax 22
int n,tmp,sol,trie[Nmax][2],rep[Bmax],last[Bmax],best[Bmax]; //trie[][0]-exista bit , trie[][1]-pozitie
int val,finish,start;
FILE *in,*out;
void desc(int a) {
int poz=0;
while (a) {
++poz;
rep[Bmax-poz]=a&1;
a=a>>1;
}
}
void query(int nod,int p) {
if (p==Bmax) {
val=trie[nod][1];
return ;
}
if (trie[2*nod][0] && rep[p]==1) {
best[p]=1;
query(2*nod,p+1);
return ;
}
if (trie[2*nod+1][0] && rep[p]==0) {
best[p]=1;
query(2*nod+1,p+1);
return ;
}
if (trie[2*nod][0]) {
best[p]=(0^rep[p]);
query(2*nod,p+1);
return ;
}
if (trie[2*nod+1][0]) {
best[p]=(1^rep[p]);
query(2*nod+1,p+1);
}
}
void insert(int nod,int p) {
if (p==Bmax+1) return ;
if (p==Bmax) trie[nod][1]=val;
trie[nod][0]=1;
if (rep[p]==1)
insert(2*nod+1,p+1);
if (rep[p]==0)
insert(2*nod,p+1);
}
int main() {
int i,j,k,sum;
in=fopen(fin,"r"); out=fopen(fout,"w");
fscanf(in,"%i",&n);
val=0; sol=-1;
insert(1,1); //inserez 0
for (i=1;i<=n;++i) {
fscanf(in,"%i",&tmp);
for (k=0;k<Bmax;++k) best[k]=rep[k]=0;
desc(tmp);
for (k=1;k<Bmax;++k) {
rep[k]=( rep[k]^last[k] );
last[k]=rep[k];
}
query(1,1);
sum=0; j=0;
for (k=Bmax-1;k>0;--k,++j) sum+=( best[k]*(1<<j) );
if (sum>sol) {
sol=sum;
finish=i;
start=val+1;
}
val=i;
insert(1,1);
/*
for (k=1;k<Bmax;++k) printf("%i",best[k]);
printf("\n");
*/
}
fprintf(out,"%i %i %i\n",sol,start,finish);
fclose(in); fclose(out);
return 0;
}