NC14247-Xorto

Xorto

https://ac.nowcoder.com/acm/problem/14247

知识点:前缀和(可有可无,不过看着舒服...)
题意:给出一个长度为n的数组,求互不重叠的、异或和为零的非空区间对个数。
思路:给出一个从左到右移动的分界线,统计左边异或和值个数,累加左边与右边区间异或和值相同的区间个数。为了防止重复,左边只统计包含分界线的区间,右边只统计与分界线相邻的区间。
代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1005,M=140000;//M的取值大于等于1<<17-1就行
int a[N],b[M];
int main()
{
    int n;
    ll ans=0;
    cin>>n;
    for(int i=1;i<=n;i++) scanf("%d",a+i),a[i]^=a[i-1];
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++)
            b[(a[i]^a[j-1])]++;
        for(int k=i+1;k<=n;k++)
            ans+=b[a[k]^a[i]];
    }
    cout<<ans<<endl;
    return 0;
}
全部评论

相关推荐

沟头学院:无关比赛不要写,这样会显着你主次不分,比赛不要撒谎,有哪些就写那些,创新创业建议删除。技能特长可以适当夸大。
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务