【HDOJ5536】Chip Factory(Trie树)
题意:给定n个数字,第i个数字为a[i],求max((a[i]+a[j])^a[k]),其中i,j,k互不相同
n<=1000,0<=a[i]<=1e9
思路:队友写的,抱大腿
先对于a[i]建立Trie树
枚举i和j后删除Trie中的i和j,然后就是经典的Trie树应用:优先朝与a[i]+a[j]的当前位不同的方向走,能获得最大xor和
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 const int maxn=1e3+5; 5 int a[maxn*maxn][2]; 6 int b[maxn],num[maxn*maxn*2],tot; 7 void init() 8 { 9 tot=1; 10 } 11 void insert (int x) 12 { 13 int rt=1; 14 for(int i=30;i>=0;i--) 15 { 16 int g=(x>>i)&1; 17 if(a[rt][g]==0) 18 { 19 a[rt][g]=++tot; 20 } 21 rt=a[rt][g]; 22 num[rt]++; 23 } 24 } 25 void del(int x) 26 { 27 int rt=1; 28 for(int i=30;i>=0;i--) 29 { 30 int g=(x>>i)&1; 31 rt=a[rt][g]; 32 num[rt]--; 33 } 34 } 35 int find(int x) 36 { 37 int rt=1; 38 int sum=0; 39 for(int i=30;i>=0;i--) 40 { 41 int g=(x>>i)&1; 42 // printf("%d %d %d\n",g,a[rt][!g],a[rt][g]); 43 if(a[rt][!g]==0||num[a[rt][!g]]==0) 44 { 45 rt=a[rt][g]; 46 } 47 else 48 { 49 // printf("i = %d\n",i); 50 rt=a[rt][!g]; 51 sum+=1<<i; 52 } 53 //printf("%d\n",sum); 54 } 55 return sum; 56 } 57 int main() 58 { 59 int T; 60 scanf("%d",&T); 61 while(T--) 62 { 63 init(); 64 int n; 65 scanf("%d",&n); 66 for(int i=1;i<=n;i++) 67 { 68 scanf("%d",&b[i]); 69 insert(b[i]); 70 } 71 int ma=0; 72 for(int i=1;i<=n;i++) 73 for(int j=i+1;j<=n;j++) 74 { 75 del(b[i]); 76 del(b[j]); 77 // printf("%d\n",find(b[i]+b[j])); 78 // puts("sdadas"); 79 ma=max(ma,find(b[i]+b[j])); 80 insert(b[i]); 81 insert(b[j]); 82 } 83 for(int i=0;i<=tot;i++) 84 { 85 a[i][0]=a[i][1]=0; 86 num[i]=0; 87 } 88 printf("%d\n",ma); 89 } 90 }
null