2020牛客寒假算法基础集训营4 子段异或
https://ac.nowcoder.com/acm/contest/3005/D
题意
输入一个数列 a ,你需要输出其中异或值为0的不同子段的数量。
一个子段 [l,r] 的异或值为al ⊕ al+1 ⊕ al+2 ⊕ … ⊕ar。
两个子段被视为相同的,当且仅当其开始和结束位置均对应相同。
题解
👍异或前缀和。
如果 [l,r] 是合法的子段,说明前缀和中 xorsum[r]^xorsum[l-1] = 0 ===> xorsum[l-1] = xorsum[r]。
求出异或前缀和,然后使用map计数每一个数字有多少个前缀和等于那个数字即可。
代码
#include<bits/stdc++.h>
using namespace std;
map<long long,int> imapi;
int main()
{
int v,i,n;
long long ans=0,temp=0;
scanf("%d",&n);
imapi[0]=1;
for(i=0;i<n;i++)
{
scanf("%d",&v);
temp^=v;
ans+=imapi[temp];
imapi[temp]++;
}
printf("%lld",ans);
system("pause");
return 0;
}