Cod sursa(job #1014506)

Utilizator lupuflaviu9lupuflaviu lupuflaviu9 Data 22 octombrie 2013 20:12:38
Problema Xor Max Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#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; 
}