2009-11-10 21:39:20來源不明

2006 NPSC C. 幼稚國王的獎賞

作法 : DFS搜組合+CUT

祥細內容請至NPSC補完計畫

/**********************************************************/

#include<stdio.h>        
#include<stdlib.h>        
int n,m;        
int input[50],MAX,num[50];
char appear[1048576];    
int queue[1048576],qtop=0;
void make (int now,int a,int n,int SUM)        
{        
  int b=a;  
  if(MAX==1048575) return;
 
  if(appear[SUM]!=0&&appear[SUM]>=now) return;
  else
     {
      if(appear[SUM]==0) queue[qtop++]=SUM;
      appear[SUM]=now;
      if(SUM>MAX) MAX=SUM;
     }
  if(now==n+1) return;
       make(now+1,b+1,n,SUM^input[now]);
       make(now+1,b+1,n,SUM);       
}        
main()        
{          
 while(scanf("%d",&n)==1&&n)        
    {        
       int a,b,c;     
       for(a=0;a<=qtop;a++)
          appear[queue[a]]=0;
       for(a=1;a<=n;a++)   
           scanf("%d",&input[a]);     
      int top=0;  
       for(a=1;a<=n;a++)  
          {  
            c=a;  
            for(b=a+1;b<=n;b++)  
               if(input[b]>input[c]) c=b;  
            int temp;  
            temp=input[c];  
            input[c]=input[a];  
            input[a]=temp;  
          }     
       for(a=1;a<=n;a++)  
          if(input[a]!=input[a-1])  
             num[++top]=input[a]; 
       MAX=0;qtop=0;
       make(1,1,top,0);           
       printf("%d\n",MAX);        
    }        
 return 0;