Cod sursa(job #12331)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 3 februarie 2007 16:21:32
Problema Xor Max Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include<stdio.h>
#define fin  "xormax.in"
#define fout "xormax.out"
#define Nmax 3000000
#define Bmax 21
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;
	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;	
}