hdu 4825 Xor Sum (10Trie树 模板)

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=4825

题意

给你一个数列,然后m次询问,每次询问给出一个x,问x和数列中某个数异或的最大值。

思路

10Trie树的模板题,这个题只有增加,没有删除。

代码

#define push_back pb
#define make_pair mk
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<cmath>
#include<map>
#include<algorithm>
#include<string>
#include<string.h>
#include<set>
#include<queue>
#include<stack>
#include<functional>
using std::pair;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int>PII;
const double PI=acos(-1);
const int maxn = 1e3 + 10;
const int maxm = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int mod =1e9+7;
const ll inf =1e18;
using namespace std;
int n,cnt,trie[maxn][2],q;

void insert(int n)
{
    int rt=1;
    for(int i=31;i>=0;i--)
    {
        int t=(n>>i)&1;
        if(trie[rt][t]==0) trie[rt][t]=++cnt;
        rt=trie[rt][t];
    }
}
int query(int n)
{
    int res=0;
    int rt=1;
    for(int i=31;i>=0;i--)
    {
        int t=((n>>i)&1)^1;
        if(!trie[rt][t]) t^=1;
        res|=t<<i;
        rt=trie[rt][t];
    }
    return res;
}
int main()
{
    int t;
    cin>>t;
    int tt=0;
    while(t--)
    {
        tt++;
        memset(trie,0,sizeof(trie));
        scanf("%d%d",&n,&q);
        cnt=1;
        int tmp;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&tmp);
            insert(tmp);
        }
        printf("Case #%d:\n",tt);
        while(q--)
        {
            scanf("%d",&tmp);
           printf("%d\n",query(tmp));
        }
    }

}

猜你喜欢

转载自blog.csdn.net/a670531899/article/details/81710340