【题目链接】
【题意】
给出n个数,其中取出两个数来,让其异或值最大。
【题解】
经典的01字典树问题。
首先需要把01字典树建出来。
然后对于每一个串都跑一遍。如果存在当前位 不同的 节点,就往那里跑,否则顺着跑。
一切尽在代码中。
【代码】
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N = 1e5+10; 5 const int M = 3e6+10; 6 int son[M][2]; 7 int a[N],n,idx; 8 void Insert(int x){ 9 int p = 0 ; 10 for(int i=31;~i;i--){ 11 int t = x >> i & 1 ; 12 if( !son[p][t] ) 13 son[p][t] = ++idx; 14 p = son[p][t] ; 15 } 16 } 17 int Query(int x){ 18 int p = 0 ; 19 int res = 0 ; 20 for(int i=31;~i;i--){ 21 int t = x >> i & 1 ; 22 if( son[p][t^1] ){ 23 res += 1<<i ; 24 p = son[p][t^1] ; 25 }else{ 26 p = son[p][t] ; 27 } 28 } 29 return res ; 30 } 31 int main() 32 { 33 scanf("%d",&n); 34 for(int i=1;i<=n;i++) 35 scanf("%d",&a[i]),Insert(a[i]); 36 int res = 0 ; 37 for(int i=1;i<=n;i++) 38 res = max( Query(a[i]) , res ); 39 printf("%d\n",res); 40 return 0 ; 41 }
01字典树
原文地址:https://www.cnblogs.com/Osea/p/11361488.html
时间: 2024-11-05 00:16:39