这题也是用到了偏移向量
一个由0,1组成的数字串~~,现在你问一个人一些问题,第i位到第j位的1的个数为奇数还是偶数。他会告诉你答案, 但是答案可能会自相矛盾,现在就是最多能有前几个回答是不矛盾的。
设r[i]表示第1位到第i位的1个数的奇偶状况,r[i] = 0表示有偶数个1,r[i] = 1表示有奇数个1。
那么要是第i位到第j位为偶数个1时,r[i-1] = 1, r[j] = 1 或r[i-1] = 0, r[j] = 0 所以 r[i-1] ^ r[j] = 0
要是为奇数个1时,r[i-1] = 1, r[j] = 0 或 r[i-1] = 0, r[j] = 1所以r[i-1] ^ r[j] = 1
那么我们可以使用并查集,用一个数组d[i]代表r[i]与其祖先的异或值
如果回答的两个区间的端点以前都出现过,那么就判断异或值是否与以前的那个相等
如果没出现过,就直接合并,更新异或值
[cpp]
#include
#include
#include
#include
#include
#include