Xor Sum 【HDU
阿新 • • 發佈:2019-02-12
題目連結
我用指標來寫的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; }