『异或前缀和与计数』

异或前缀和

首先知道前缀和的概念,要求区间的和只需要用右边界的和减去左边界的和即可得到。

其区间异或,也可以用前缀和的思想,只不过需要做的操作是用左边界的前缀和与右边界的前缀和进行异或,即可得到区间的元素异或。

计数

对于需要找到与当前前缀相等的前缀,采用维护一个数组的方法,存前面相同元素出现的次数,每出现一次都++;

例题

https://codeforces.ml/contest/1113/problem/C

 代码

#include<bits/stdc++.h>
using namespace std;
int sum[300005];
int num[1<<20][2];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        int temp;
        cin>>temp;
        sum[i]=sum[i-1]^temp;
    }
    num[0][0]=1;
    long long ans=0;
    for(int i=1;i<=n;i++){
        ans+=num[sum[i]][i%2];
        num[sum[i]][i%2]++;
    }
    cout<<ans<<endl;
} 

猜你喜欢

转载自www.cnblogs.com/LH2000/p/12701350.html