利用01字典樹查詢最大異或值
阿新 • • 發佈:2018-08-22
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字典樹查詢最大異或值