hdu-4825(01字典树)

题意:中文题意

解题思路:01字典树板子题

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define maxn 100050
#define ll long long
using namespace std;
int trie[maxn*32][2];
ll val[maxn*32];
ll x,y;
int root;
int tot;
int n,t,m;
void init()
{
    memset(trie,0,sizeof(trie));
    root=0;tot=0;
}
void get_trie(ll u)
{
    int root=0;
    for(int i=32;i>=0;i--)
    {
        int id=(u>>i)&1;
        if(!trie[root][id])
            trie[root][id]=++tot;
        root=trie[root][id];
    }
    val[root]=u;
}
ll query(ll u)
{
    int root=0;
    for(int i=32;i>=0;i--)
    {
        int id=(u>>i)&1;
        if(trie[root][id^1])
            root=trie[root][id^1];
        else
            root=trie[root][id];
    }
    return val[root];
}
int main()
{
    while(scanf("%d",&t)!=EOF)
    {
        int tt=0;
        while(t--)
        {
            init();
            tt++;
            scanf("%d%d",&n,&m);
            for(int i=1;i<=n;i++)
            {
                scanf("%lld",&x);
                get_trie(x);
            }
            printf("Case #%d:\n",tt);
            while(m--)
            {
                scanf("%lld",&y);
                ll ans=query(y);
                printf("%lld\n",ans);
            }
        }
    }
}

  

posted @ 2018-08-23 18:50  荒岛的龟  阅读(264)  评论(0编辑  收藏  举报