AT4142 [ARC098B] Xor Sum 2
给定数列 \(A\),求满足 \(a_l+\cdots+a_r=a_l\ {\rm xor}\ \cdots\ {\rm xor}\ a_r\) 的 \((l,r)\) 数量。
因为异或本质为二进制下不进位的加法,所以不难得到 \(a\ {\rm xor}\ b\leq a+b\)。
相当于是当一个区间 \((l,r)\) 满足上述条件,当且仅当它的所有子区间都满足条件。
并且如果 \((l,r)\) 不满足条件,那么 \((l,r+k)\) 也不可能满足条件,因为小于的之后没办法补足。
那么就可以直接双指针维护了。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N = 200010;
const int M = N * 20;
int n; LL a[N], b[N];
int read(){
int x = 0, f = 1; char c = getchar();
while(c < '0' || c > '9') f = (c == '-') ? -1 : 1, c = getchar();
while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();
return x * f;
}
int main(){
n = read();
for(int i = 1; i <= n; i ++){
int x = read();
a[i] = a[i - 1] + x;
b[i] = b[i - 1] ^ x;
}
LL ans = 0;
for(LL r = 1, l = 1; r <= n; r ++){
while((a[r] - a[l - 1]) != (b[r] ^ b[l - 1])) l ++;
ans += r - l + 1;
}
printf("%lld\n", ans);
return 0;
}