1. 程式人生 > >【Hdu4825】Xor Sum(01字典樹)

【Hdu4825】Xor Sum(01字典樹)

insert else 結果 char clu 向人 logs mark 每次

Description

Zeus 和 Prometheus 做了一個遊戲,Prometheus 給 Zeus 一個集合,集合中包含了N個正整數,隨後 Prometheus 將向 Zeus 發起M次詢問,每次詢問中包含一個正整數 S ,之後 Zeus 需要在集合當中找出一個正整數 K ,使得 K 與 S 的異或結果最大。Prometheus 為了讓 Zeus 看到人類的偉大,隨即同意 Zeus 可以向人類求助。你能證明人類的智慧麽?

Solution

01字典樹入門題

Code

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std; int T,n,m,ch[3000010][2],rt,v[3000010],A[100010]; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return
x*f; } void Insert(int x,int id){ int u=0,op; for(int i=31;i>=0;--i){ op=((x&(1<<i))!=0); if(!ch[u][op]) ch[u][op]=rt++; u=ch[u][op]; } v[u]=id; } int get(int x){ int u=0,op; for(int i=31;i>=0;--i){ op=((x&(1<<i))!=0); if
(ch[u][op^1]!=0) u=ch[u][op^1]; else u=ch[u][op]; } return A[v[u]]; } int main(){ T=read(); for(int cas=1;cas<=T;++cas){ n=read(),m=read(); rt=1; memset(ch,0,sizeof(ch)); memset(v,0,sizeof(v)); for(int i=1;i<=n;++i) Insert(A[i]=read(),i); printf("Case #%d:\n",cas); while(m--) printf("%d\n",get(read())); } return 0; }

【Hdu4825】Xor Sum(01字典樹)