Xor Sum 2

题目描述

There is an integer sequence A of length N.
Find the number of the pairs of integers l and r (1≤l≤r≤N) that satisfy the following condition:
Al xor Al+1 xor … xor Ar=Al + Al+1 + … + Ar
Here, xor denotes the bitwise exclusive OR.

Definition of XOR
Constraints
1≤N≤2×105
0≤Ai<220
All values in input are integers.

输入

Input is given from Standard Input in the following format:
N
A1 A2 … AN

输出

Print the number of the pairs of integers l and r (1≤l≤r≤N) that satisfy the condition.
样例输入 Copy
4
2 5 4 6
样例输出 Copy
5

提示

(l,r)=(1,1),(2,2),(3,3),(4,4) clearly satisfy the condition. (l,r)=(1,2) also satisfies the condition, since A1 xor A2=A1 + A2=7. There are no other pairs that satisfy the condition, so the answer is 5.

求出有多少个区间(l,r) 满足区间的异或和等于区间和

区间异或和 与 区间和 在处理完前缀之后,会满足:

a[l] + a[l+1] + .... == sum[r] - sum[l-1]
a[l] ^ a[l+1] ^ ... == xorSum[r] ^ xorSum[l-1]

对于一个左端点l和右端点r,如果说l->r之间满足区间异或和等于区间和,那么说从l -> r-1也是满足的,所以说此时对答案的贡献便是区间的长度r - l + 1,我们只需要找满足情况的最右端的端点就好,然后统计对答案的贡献

区间的个数会爆掉int,记得开long long
二分的时候直接将l or r 当成区间的端点可能不太准确,需要将每次的mid用一个变量记录下来
二分代码:

typedef int itn;
int n,k;
ll a[maxn];
ll s[maxn];
ll sxor[maxn];
int main()
{
	n = read;
	for(int i=1;i<=n;i++) a[i] = read;
	for(int i=1;i<=n;i++){
		s[i] = s[i-1] + a[i];
		sxor[i] = sxor[i-1] ^ a[i];
	}
	ll ans = 0;
	for(int i=1;i<=n;i++){
		int l = i,r = n;
		int t = 0;
		while(l <= r){
			int md = (r + l) >> 1;
			if(s[md] - s[i-1] == (sxor[md] ^ sxor[i-1])){
				l = md + 1;
				t = md;
			}
			else r = md - 1;
		}
		ans += t - i + 1;
	}
	cout << ans << endl;
    return 0;
}

尺取代码:

typedef int itn;
int n,k;
ll a[maxn];
ll s[maxn];
ll sxor[maxn];
int main()
{
    n = read;
    for(int i=1;i<=n;i++) a[i] = read;
    ll ans = 0;
    for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i],sxor[i] = sxor[i-1] ^ a[i];
    ll sum = 0;
    int l = 1;
    for(int i=1;i<=n;i++){
        while((sum^a[i]) != sum + a[i]){
            sum ^= a[l];
            l ++;
        }
        sum ^= a[i];
        ans += i - l + 1;
    }
    cout << ans <<endl;
    return 0;
}
 
/**************************************************************
    Problem: 7731
    Language: C++
    Result: 正确
    Time:28 ms
    Memory:25468 kb
****************************************************************/
posted @ 2021-07-27 12:44  PushyTao  阅读(43)  评论(0编辑  收藏  举报