を固定した時、を最大にするを効率的に探索します。
のビットを上から下へ見ていきます。
最適なはとのxorを計算した時、ビット目が1となるものです。
これはビット目が1になる方が、その下のビットが全て1であっても結果として大きい値になるからです。
事前に数列をソートしておくと、各ビット位置に注目した場合にそのビットが0となる範囲と1となる範囲に分けることができます。
そして、適切な範囲を選択し各ビットごとに範囲を狭めていくことで解けます。
xxxxxxxxxx
use proconio::*;
fn main() {
input! {
n: usize,
mut a:[usize; n],
}
a.sort();
let mut ans = 0;
for i in 0..n-1 {
let mut l = i+1;
let mut r = n;
for d in (0..30).rev() {
if a[l]>>d & 1 == a[r-1]>>d & 1 {
continue;
}
// dビット目が0となる範囲[l, ok]を求める
let mut ok = l;
let mut ng = r-1;
while ng - ok > 1 {
let mid = (ng+ok)/2;
if a[mid] >> d & 1 == 0 {
ok = mid;
} else {
ng = mid;
}
}
if a[i]>>d & 1 == 1 {
r = ng
} else {
l = ng;
}
}
ans = ans.max(a[i] ^ a[l]);
}
println!("{}", ans);
}