hdu4825(01trie)

模板题

题意就是给一个集合s,一个数,在集合里找到与该数异或值最大的数是多少

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
struct node
{
    int son[2],val;
    void reset()
    {
        son[0]=son[1]=val=0;
    }
}tree[maxn*32];
int cnt;
void myinsert(int x)
{
    int r=0;
    for(int i=31;i>=0;i--)
    {
        int v=(x>>i)&1;
        if(!tree[r].son[v])
        {
            tree[++cnt].reset();
            tree[r].son[v]=cnt;
        }
        r=tree[r].son[v];
    }
    tree[r].val=x;

}
int query(int x)
{
    int r=0,v;
    for(int i=31;i>=0;i--)
    {
        v=(x>>i)&1;
        if(tree[r].son[v^1])
            r=tree[r].son[v^1];
        else
            r=tree[r].son[v];
    }
    return tree[r].val;
}
int main()
{
    int t,icase=0,n,m,x;
    scanf("%d",&t);
    while(t--)
    {
        cnt=0;
        tree[0].reset();
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++) scanf("%d",&x),myinsert(x);
        printf("Case #%d:\n",++icase);
        while(m--)
        {
            scanf("%d",&x);
            printf("%d\n",query(x));
        }
    }
    return 0;
}

 

posted @ 2019-01-23 18:52  eason99  阅读(71)  评论(0编辑  收藏  举报