种方法
一:动态规划
通过观察数据可以发现a[i]的值最大是2^20,很细节。首先一个异或的性质是a xor b = c可以推出a xor c = b。我们可以建立一个数组b,b[i]=x xor a[i],在之后的数中一旦查到这个数和之前的b数组的某个值相等,即两个数可以组成异或对。现在问题是如何找到和a[i]相等的b的位置,注意到a的范围,可以用桶存b的位置,loc[b[i]]=i。f[i]表示[1,i]之间所有异或对中左边的数的位置的最大值,得到状态转移方程f[i]=max{f[i-1],loc[a[i]]}。输出自然判断f[r]是否大于等于l即可。
二:ST表/线段树
我们很容易维护在每一个位置上的数的异或对的最大位置,记为loc[i]。对于每个l r,寻找l<=k<=r,使得loc[k]的值大于等于l即可,可转换为找在l和r区间的loc的最大值,判断是否大于l,到这里可以清晰地判断出区间最值用ST表最好,线段树也行。