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

来源:互联网 发布:手机养兔子软件 编辑:程序博客网 时间:2024/06/06 10:43

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

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


阅读全文
0 0
原创粉丝点击