1. 程式人生 > >利用01字典樹查詢最大異或值

利用01字典樹查詢最大異或值

void max ret ++ 使用 str spa hdu sizeof

01字典樹的是只含有0和1兩種字符的字典樹,在使用它的時候,把若幹數字轉成二進制後插入其中

在查詢樹中的哪個數字和給定數字有最大異或值的時候,從根開始貪心查詢就ok了

HDU4825是一道裸題:給出n個數和m次詢問,每次詢問給出一個數x,問在n個數中哪個數與x異或值最大

 1 #include<cstdio>
 2 #include<cstring>
 3 const int maxn=1000005;
 4 int n,m,rt;
 5 int a[maxn],v[3500005],s[3500005][2];
 6 void in(int x,int id)
 7 {
 8     //把每一個數字拆成二進制從高到低插入Trie樹裏面 
9 int op,u=0; 10 for(int i=31;i>=0;i--) 11 { 12 op=((x&(1<<i))!=0); 13 if(s[u][op]==0) s[u][op]=rt++; 14 u=s[u][op]; 15 } 16 v[u]=id; 17 } 18 int get(int x) 19 { 20 int op,u=0; 21 for(int i=31;i>=0;i--) 22 { 23 op=((x&(1<<i))!=0
); 24 if(s[u][op^1]!=0) //盡可能走與當前位不同的點 25 u=s[u][op^1]; 26 else u=s[u][op]; 27 } 28 return a[v[u]]; 29 } 30 int main() 31 { 32 int T,u; 33 scanf("%d",&T); 34 for(int cas=1;cas<=T;cas++) 35 { 36 scanf("%d%d",&n,&m); 37 rt=1
; 38 memset(s,0,sizeof(s)); 39 memset(v,0,sizeof(v)); 40 for(int i=1;i<=n;i++) 41 { 42 scanf("%d",&a[i]); 43 in(a[i],i); 44 } 45 printf("Case #%d:\n",cas); 46 for(int i=1;i<=m;i++) 47 { 48 scanf("%d",&u); 49 printf("%d\n",get(u)); 50 } 51 } 52 return 0; 53 }

利用01字典樹查詢最大異或值