这个题无论是 D1 还是 D2 都很具有思维含量。
首先考虑 \(a_i \le 200\) 怎么做。
考虑异或有性质 \(|a - b| \le a \oplus b \le a + b\),那么推一下就会知道目前 \(j\) 一定 \(\ge i - 400\),暴力枚举即可。
然后思考 \(a_i \le 10^9\) 怎么做。
我们称 DP 时 \(i\) 可以从 \(j\) 转移过来,即 \(a_j \oplus i < a_i \oplus j\),需要注意一些很本质的东西。
那么这个式子的意思就是,存在一个 \(k\) 使得两数前 \(k\) 位都相等(从高到低数),然后第 \(k + 1\) 位 \(a_j \oplus i\) 为 \(0\),\(a_i \oplus j\) 为 \(1\)。
我们肯定是希望别 \(i, j\) 两项混在一起,我们更希望将其分开,注意到如果其前 \(k\) 位相等,那么 \(a_i \oplus i\) 和 \(a_j \oplus j\) 前 \(k\) 位也相等,我们只需要记录其第 \(k + 1\) 位的信息即可,那么就很简单了,考虑设 \(f_{i, 0/1, 0/1}\) 表示到了 trie 树上第 \(i\) 个结点,此时对于 \(j\) 来说其当前位为 \(0/1\),对于 \(a_j\) 来说当前位为 \(0/1\) 的最大值,那么转移就扫一遍即可了。