一般和异或相关的求和都是一位一位来的。这题也一样。
首先看第一问。令sum[i]=a[1]^a[2]^...^a[i],那么xor(l,r)=sum[l-1]^sum[r],考虑每一位对答案带来的影响。假设现在考虑二进制第k位(从低到高)对答案的影响。
对于sum[x],它的第k位对答案的影响为2^k*t,其中t为1..x-1中sum[]值二进制第k位与sum[x]不同的数的个数。那么在k确定的情况下O(N)扫一遍即可。时间复杂度O(Nmax{log A})。
然后看第二问,继续考虑第k位对答案的影响。令sum[i]=sum[i-1]+a[i],则sum(l,r)=sum[r]-sum[l-1],那么第k位对答案有影响当且仅当存在奇数对(x,y),满足x<=y且sum[x-1]和sum[y]的第k为不同。考虑在mod (2^(k+1))的意义下,任意;两个sum[l]和sum[r],它们的第k为不同,当且仅当sum[r]-sum[l]>=2^k,或者sum[r]+2^k+1-sum[l]>=2^k。因此只需要考虑有多少对(x,y),x<=y,满足sum[y]-sum[x-1]>=2^k 或者sum[y]<sum[x-1] 且 sum[x-1]-sum[y]<=2^k即可,用树状数组维护即可。时间复杂度O(NlogNlog sum|A|)。