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;
}
posted @ 2020-02-14 22:10  Vivid-BinGo  阅读(116)  评论(0编辑  收藏  举报