Codeforces Round #367 (Div. 2) Vasiliy's Multiset xor trie

来源:互联网 发布:淘宝开店需要交保证金 编辑:程序博客网 时间:2024/05/23 05:09

又学到了一个处理xor的特殊技巧。。。
发个牢骚每次打codeforces感觉要涨很多分就会挂题干!!!!!!!!!!
没激情了。。。。

#include<cstdio>#include<algorithm>#include<iostream>#define maxn 8000000using namespace std;struct node{   int son[2],am[2];   node(){        son[0] = son[1] = -1;        am[0] = am[1] = 0;   }}node[maxn];int root = 1,l=1;void change(int flag,int val){    int pre = root;    for(int i=30;i>=0;i--)    {        if(node[pre].son[(val&(1<<i))!=0]!=-1)        {          node[pre].am[(val&(1<<i))!=0] += flag;          pre = node[pre].son[(val&(1<<i))!=0];        }        else{            ++l;            node[pre].son[(val&(1<<i))!=0] = l;            node[pre].am[(val&(1<<i))!=0]+=flag;            pre = l;        }    }}int find(int va){     int ans = va,pre = root;     for(int i=30;i>=0;i--)      if(ans&(1<<i))      {          if(node[pre].son[0]!=-1&&node[pre].am[0]) pre = node[pre].son[0];          else{              ans^=(1<<i);              pre = node[pre].son[1];          }      }      else      {          if(node[pre].son[1]!=-1&&node[pre].am[1])          {              pre = node[pre].son[1];              ans^=(1<<i);          }          else pre = node[pre].son[0];      }      return max(ans,va);}char s[5];int main(){    int q,a;    scanf("%d",&q);    while(q--)    {      scanf("%s %d",s,&a);       if(s[0]=='+')change(1,a);       else if(s[0]=='-')change(-1,a);       else {           printf("%d\n",find(a));       }    }    return 0;}
0 0
原创粉丝点击