分析
由于我们可以二进制按位贪心
所以直接使用01Trie
树即可
维护每个数字的终止节点
对于每个数,每次贪心往0或1走即可
时间复杂度:
代码
//The XOR Largest Pair #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #define LL long long #define Cl(X,Y) memset((X),(Y),sizeof(X)) #define FOR(i,A,B) for(int i=A;i<=B;i++) #define BOR(i,A,B) for(int i=A;i>=B;i--) #define Debug(X) cerr<<#X<<" = "<<X<<" " #define Lowbit(X) (X & (-X)) #define Skip cout<<endl; #define INF 0x3f3f3f3f #define Mod 998244353 #define Rson (X<<1|1) #define Lson (X<<1) #define Min(a,b) (a)<(b)?(a):(b) #define Max(a,b) (a)>(b)?(a):(b) #define in(i) (i=read()) using namespace std; int read() { int ans=0,f=1; char i=getchar(); while(i<'0' || i>'9') {if(i=='-') f=-1; i=getchar();} while(i>='0' && i<='9') {ans=(ans<<1)+(ans<<3)+i-'0'; i=getchar();} return ans*f; } int n,m,tot,ans; int trie[4000010][2],cnt[4000010]; void insert(int x) { int p=0; for(int i=31;i>=0;i--) { int c=(x>>i)&1; if(!trie[p][c]) trie[p][c]=++tot; p=trie[p][c]; } } int search(int x) { int p=0,ans=0; for(int i=31;i>=0;i--) { int c=(x>>i)&1,o=c^1; if(trie[p][o]) p=trie[p][o],ans=ans<<1|1; else p=trie[p][c],ans<<=1; } return ans; } int main() { in(n); for(int i=1;i<=n;i++) { int x; in(x); ans=Max(ans,search(x)); insert(x); } cout<<ans<<endl; return 0; }