XOR最大パス
XOR最長パス
質問の意味:n個の数値Aiが与えられた場合、XORの後に2つの数値Aの最大値を尋ねます
フラッシュバックでトライを作成し、pに到達するたびに相対位置を判断し、相対位置がある場合はそこから開始します。
int n;
int trie[maxn*32+5][2],tot=1;
void inser(LL a){
//trie插入
int p=1;
LL ch=1ll;
for(LL i=32;i>=0;i--){
ch=a>>i&1ll;
if(trie[p][ch]==0)trie[p][ch]=++tot;
p=trie[p][ch];
}
}
LL sear(LL a){
int p=1;
LL ch=1ll,ans=0ll;
for(LL i=32;i>=0;i--){
ch=a>>i&1ll;
if(trie[p][ch^1]){
//相对位置
p=trie[p][ch^1];
ans|=1<<i;
}else{
p=trie[p][ch];
}
}
return ans;
}
LL A[maxn];
int main(){
int n;
sci(n);
LL res=0;
for(int i=1;i<=n;i++){
scl(A[i]);
inser(A[i]);
res=max(res,sear(A[i]));
}
cout<<res<<endl;
return 0;
}