1. 程式人生 > >Xor Sum 【HDU

Xor Sum 【HDU

題目連結

我用指標來寫的01字典樹,從第32位往下遞減至0位即可。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
using namespace std;
typedef long long ll;
struct node
{
    int cnt;
    node *next[2];
};
node *root;
int N,M;
void build(ll x)
{
    node *now=root;
    for(int i=32; i>=0; i--)
    {
        int temp=(x>>i)&1;
        if(now->next[temp]==NULL)
        {
            now->next[temp]=new node();
        }
        now=now->next[temp];
        now->cnt++;
    }
}
ll Query(ll x)
{
    node *now=root;
    ll res=0;
    for(int i=32; i>=0; i--)
    {
        int temp=(x>>i)&1;
        temp=temp^1;
        if(now->next[temp]==NULL)
        {
            now=now->next[1-temp];
            res+=(1-temp)<<i;
        }
         else
         {
             now=now->next[temp];
             res+=temp<<i;
         }
    }
    return res;
}
int main()
{
    int T;
    scanf("%d",&T);
    root=(node *)malloc(sizeof(node));
    for(int Case=1; Case<=T; Case++)
    {
        scanf("%d%d",&N,&M);
        root->next[0]=NULL;
        root->next[1]=NULL;
        for(int i=1; i<=N; i++)
        {
            ll e1;
            scanf("%lld",&e1);
            build(e1);
        }
        printf("Case #%d:\n",Case);
        while(M--)
        {
            ll e1;
            scanf("%lld",&e1);
            printf("%lld\n",Query(e1));
        }
    }
    return 0;
}