Codeforces Round #367 (Div. 2)-Vasiliy's Multiset-最大异或和-trie

来源:互联网 发布:kali linux安装输入法 编辑:程序博客网 时间:2024/06/09 16:01


参考。。http://blog.csdn.net/viphong/article/details/52167649


注意要先插入0。。。特判一下0不能删除

#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <iostream>#include <queue>#include <map>#include <vector>using namespace std;#define inf 2147483647const int maxnode = 200005*32;struct trie{    int ch[maxnode][2];    int val[maxnode];    int sz;    void init()    {        sz=1;        val[0]=0;//可不需要        memset(ch[0],0,sizeof(ch[0]));    }    void insert(int s )    {        int u=0,n=31,i;        for (i=0; i<n; i++)        {            int c=s&(1<<(30-i));            c=!!c;            if (!ch[u][c])            {                memset(ch[sz],0,sizeof(ch[sz]));                val[sz]=1;                ch[u][c]=sz++;            }            else                val[ch[u][c]]++;            u=ch[u][c];        }        // val[u]=num;    }    void del(int s )    {        int u=0,n=31,i;        for (i=0; i<n; i++)        {            int c=s&(1<<(30-i));            c=!!c;            val[ch[u][c]]--;            u=ch[u][c];        }        // val[u]=num;    }    int query_if(int s)    {        int ret=0;        int u=0,n=31,i;        int nex;        for (i=0; i<n; i++)        {            int c=s&(1<<(30-i));            c=!!c;            if (ch[u][c^1]>0&&val[ch[u][c^1]]>0)                c^=1;            ret|=c<<(30-i);            u=ch[u][c];        }        return ret;    }};trie tp;int main(){//   while(scanf("%d",&n)!=EOF)    int n;    cin>>n;    tp.init();    tp.insert(0);    char tmp[5];    int x;    for (int i=1; i<=n; i++)    {        scanf("%s%d",tmp,&x);        if (tmp[0]=='+')        {            if (x)            tp.insert(x);        }        else if (tmp[0]=='-')        {            if (x)            tp.del(x);        }        else            printf("%d\n",tp.query_if(x)^x);    }    return 0;}


0 0
原创粉丝点击