AT4142 [ARC098B] Xor Sum 2

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;
}
posted @ 2021-07-12 10:18  LPF'sBlog  阅读(40)  评论(0编辑  收藏  举报