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