CSU 1216 异或最大值
求n个数里面,求两两异或的最大值
直接来肯定会超时
既然要异或最大值,那么两个数的二进制肯定是正好错开为好、、、为了能快速找到错开的数,确实有点难想到,用字典树,按二进制数插入,再一个一个在字典树里面找离他最远的即可。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int n; int A[100010]; int ch[20*100010][2],cnt; int val[20*100010]; void inserts(int x) { int rt=0; for (int i=30;i>=0;i--){ bool k=((1<<i)&x); if (ch[rt][k]==-1){ ch[rt][k]=cnt++; } rt=ch[rt][k]; } val[rt]=x; } int query(int x) { int rt=0; for (int i=30;i>=0;i--){ bool k=((1<<i)&x); if (ch[rt][!k]!=-1){ rt=ch[rt][!k]; } else rt=ch[rt][k]; } //cout<<val[rt]<<endl; return x^val[rt]; } int main() { //int test=(1<<2)&3; //cout<<test<<endl; while (scanf("%d",&n)!=EOF) { cnt=1; memset(ch,-1,sizeof ch); for (int i=0;i<n;i++){ scanf("%d",&A[i]); inserts(A[i]); } int ans=0; for (int i=0;i<n;i++){ int res=query(A[i]); ans=max(ans,res); } printf("%d\n",ans); } return 0; }