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;
}