ACDream 平衡树

第一道字典树的题,看了别人的题解,大致写了一下。。。

#include<cstdio>
struct tree{
	int s[2],v;
	void reset(){
		s[0]=s[1]=v=-1;
	}
}t[350000];
int top;
int dig[10];
void fdig(int x){
	for(int i=0;i<32;i++){
		dig[31-i]=x&1;
		x>>=1;
	}
}
void add(int x){
	fdig(x);
	int root=0;
	for(int i=0;i<32;i++){
		if(t[root].s[dig[i]]==-1){
			t[++top].reset();
			t[root].s[dig[i]]=top;
		}
		root=t[root].s[dig[i]];
	}
	t[root].v=x;
}
int find(int x){
	fdig(x);
	int root=0;
	for(int i=0;i<32;i++){
		if(t[root].s[dig[i]]==-1)
			dig[i]^=1;
		root=t[root].s[dig[i]];
	}
	return t[root].v;
}
int main(){
	int cs,n,x;
	char s[10];
	scanf("%d",&cs);
	while(cs--){
		scanf("%d",&n);
		t[0].reset();top=0;
		while(n--){
			scanf("%s%d",s,&x);
			if(s[0]=='i')add(x);
			if(s[2]=='i')printf("%d\n",find(x)^x);
			if(s[2]=='a')printf("%d\n",find(~x)^x);
		}
	}
	return 0;
}


 

你可能感兴趣的:(ACDream 平衡树)