The XOR Largest Pair
字典树求最大的一对数异或值
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,x,tot,ans,trie[5000005][2];
inline int read(){
int x=0,y=1;char c=getchar();
for(;c<'0'||c>'9';c=getchar()) y-=(c=='-')<<1;
for(;c>='0'&&c<='9';c=getchar()) x=x*10+(c&15);
return x*y;
}
int find(int x){
int u=1,ans=0;
for(int i=30;i>=0;i--){
int c=(x>>i)&1;c=!c;
if(trie[u][c]) u=trie[u][c],ans+=1<<i;
else u=trie[u][!c];
}
return ans;
}
void insert(int x){
int u=1;
for(int i=30;i>=0;i--){
int c=(x>>i)&1;
if(!trie[u][c]) trie[u][c]=++tot;
u=trie[u][c];
}
}
int main(){
n=read();tot=1;
for(int i=1;i<=n;i++){
x=read();
ans=max(ans,find(x));
insert(x);
}
printf("%d\n",ans);
}
为什么for(int i=30;i>=0;i--)里i要等于30啊?其他数就会错
数据范围如下:
每个数小于2^31