题解 AT4142 【[ARC098B] Xor Sum 2】
发布于 2020-11-21
一道较简单的题目。
题意
给你一些数字,求有多少区间的异或和等于区间的数字之和。
题解
如果直接枚举的话,时间复杂度略高。怎么办呢?可以用两指针,一个指针固定,一个指针滑动。而后,就可以找到最大满足条件的端点了。
代码:
#include<iostream>
#include<cstring>
using namespace std;
const int N=200020;
long long s,n,a[N],ans=0;
int main()
{
cin>>n;
//memset(last,0,sizeof(last));
for(int i=1;i<=n;i++) cin>>a[i];
long long j=0;
long long suma=0,sumb=0;
for(int i=1;i<=n;i++)
{
while(j+1<=n&&sumb+a[j+1]==(suma^a[j+1]))//指针滑动
{
suma^=a[j+1];
sumb+=a[j+1];
j++;
}
ans+=j-i+1;
suma^=a[i];
sumb-=a[i];
}
cout<<ans;
return 0;
}