思路
考虑将区间异或转换,我们处理一个异或前缀和数组,我们能够发现通过前缀和数组原来i-j的区间异或变成了pre[j]^pre[i-1]。然后我们逐个插入前缀和pre[i],再由高到低逐个枚举k的二进制位:
- 当k的第i位为1:显然我们要找一个使pre[i]异或后为1的数才能保证比k-1大。
- 当k的第i位为0:如果我们找到一个使pre[i]异或后为1的数,那么异或后的数肯定比k-1大,我们直接在ans中加上这种数的个数(所以节点上要维护一个val次数数组),然后异或为1的不再考虑,我们进入异或后该位为0的节点。
对每个前缀和的答案累加就是最后的答案。
代码
1 |
|