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\n",max(num,num^query(num)));
	}
}


转载于:https://www.cnblogs.com/Drenight/p/8611218.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值