Codeforces Round #367 (Div. 2) Vasiliy's Multiset 异或字典树带删除模板

多重集版的异或字典树,拿之前的板子瞎改了改居然能用,看来功能理解得没错。。

莫名wa7,回忆一波代码意义之后感觉没问题啊

读读题发现这个多重集里居然永远有0

。。。

赛中能debug出来还是挺开心的

#include<bits/stdc++.h>  
//#pragma comment(linker, "/STACK:1024000000,1024000000")   
#include<stdio.h>  
#include<algorithm>  
#include<queue>  
#include<string.h>  
#include<iostream>  
#include<math.h>  
#include<set>  
#include<map>  
#include<vector>  
#include<iomanip>  
using namespace std;  
#define ll long long  
#define pb push_back  
#define FOR(a) for(int i=1;i<=a;i++)  
const int inf=0x3f3f3f3f;  
const int maxn=2e5+9;    
const int maxnode=32*maxn;  
  
int ch[maxnode][2];  
int val[maxnode];  
int vis[maxnode];
int sz;  
void init(){memset(ch[0],0,sizeof ch[0]);sz=1;}  
  
void insert(int num){  
	int now=0;  
	for(int i=30;i>=0;i--){  
		int c=(num>>i)&1;  
		if(!ch[now][c]){  
			memset(ch[sz],0,sizeof ch[sz]);  
			val[sz]=0; 
		   	vis[sz]=0;	
			ch[now][c]=sz++;  
		}  
		now=ch[now][c];  
		vis[now]++;
	}  
	val[now]=num;  
}  
void del(int num){
	int now=0;
	for(int i=30;i>=0;i--){
		int c=(num>>i)&1;
		now=ch[now][c];
		vis[now]--;
	}
}
int query(int num){  
	int now=0;  
	for(int i=30;i>=0;i--){  
		int c=(num>>i)&1;  
		if(ch[now][c^1] && vis[ch[now][c^1]])now=ch[now][c^1];  
		else if(vis[ch[now][c]])now=ch[now][c];  
		else{
			return 0;
		}
	}  
	return val[now];  
}  

char op[5];int num;
int main(){
	init();
	int n;scanf("%d",&n);
	while(n--){
		scanf("%s%d",op,&num);
		if(op[0]=='+')insert(num);
		else if(op[0]=='-')del(num);
		else printf("%d
",max(num,num^query(num)));
	}
}


原文地址:https://www.cnblogs.com/Drenight/p/8611218.html