NC14247 Xorto(异或+前缀和)

对于异或的题目,很多都跟前缀和放在一起,比如说这题,让你求不相交区间异或值相等的个数

很容易想到用前缀和表示区间,现在考虑如何做到不相交并且不重复计算

1.二维循环,第一维从1开始,第二维一个用来统计,一个用来更新

统计的时候,从i开始到n,把这段里面的所有区间的异或值,都看看前面有没有相等的,之后计算

更新的时候从1-i,把前面的所有的区间值都加进去

这样就做到不重不漏

#include<iostream>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=5e5+10;
int s[N];
int a[N];
int cnt[N];
int main(){
    int n;
    cin>>n;
    int i;
    for(i=1;i<=n;i++){
        cin>>a[i];
        s[i]=s[i-1]^a[i];
    }
    ll res=0;
    for(i=1;i<=n;i++){
        int j;
        for(j=i;j<=n;j++){
            res+=cnt[s[j]^s[i-1]];
        }
        for(j=1;j<=i;j++){
            cnt[s[i]^s[j-1]]++;
        }
    }
    cout<<res<<endl;
}
View Code

 

posted @ 2020-04-11 14:38  朝暮不思  阅读(150)  评论(0编辑  收藏  举报