1. 程式人生 > >HDU4825(字典樹)

HDU4825(字典樹)

從高位建樹,保證亦或值最大,如果某一位在集合裡存在不同的數,就選擇該分支,否則選擇一樣的分支

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;

struct tire
{
    tire *son[2];
    int val;
    tire()
    {
        val=0;
        son[0]=son[1]=NULL;
    }
};
tire *root;
void insert(int x)
{
    bool a[32];
    int xx=x;
    for
(int i=0;i<32;i++) a[i]=x&1,x>>=1; tire *p=root,*q; for(int i=31;i>=0;i--){ if(p->son[a[i]]!=NULL) p=p->son[a[i]]; else{ q=new tire(); p->son[a[i]]=q; p=q; } } p->val=xx; } int find(int x) { bool
a[32]; int xx=x; for(int i=0;i<32;i++) a[i]=x&1,x>>=1; tire *p=root; for(int i=31;i>=0;i--){ if(p->son[!a[i]]!=NULL) p=p->son[!a[i]]; else p=p->son[a[i]]; } return p->val; } int main() { int T,c=0; scanf("%d",&T); for
(int c=1;c<=T;c++){ int n,m,x; root=new tire(); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&x); insert(x); } printf("Case #%d:\n",c); for(int i=1;i<=m;i++){ scanf("%d",&x); printf("%d\n",find(x)); } } return 0; }