【01字典樹】HDU 4825 Xor Sum

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4825


#include <stdio.h>
#include <string.h>
#define MAX(a,b) ((a)>(b)?(a):(b))
#define NODE 32000100
#define N 100010
__int64 n,m;
__int64 node;
__int64 next[NODE][2];
__int64 end[NODE];

void add(__int64 cur,__int64 k)
{
	memset(next[node],0,sizeof(next[node]));
	end[node]=0;
	next[cur][k]=node++;
}
__int64 cal(__int64 x)
{
	__int64 i,k,cur=0;
	for(i=31;i>=0;i--)
	{
		k=((1<<i)&x)?0:1;
		if(next[cur][k]) cur=next[cur][k];
		else    cur=next[cur][1-k];
	}
	return (end[cur]);
}
int main()
{
	__int64 q;
	__int64 t,num;
	__int64 i,j,k,x,cur;
	__int64 ans;
	scanf("%I64d",&t);
	for(q=1;q<=t;++q){
		scanf("%I64d%I64d",&n,&m);

		node=1;
		memset(next[0],0,sizeof(next[0]));
		for(i=0;i<n;i++)
		{
			scanf("%I64d",&x);

			cur=0;
			for(j=31;j>=0;j--)
			{
				k=((1<<j)&x)?1:0;
				if(next[cur][k]==0) add(cur,k);
				cur=next[cur][k];
			}
			end[cur]=x;
		}
		printf("Case #%I64d:\n",q);
		for(i=0;i<m;++i){
			scanf("%I64d",&num);
			printf("%I64d\n",cal(num));
		}
	}

	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章