【每日一题0414】异或前缀和

https://ac.nowcoder.com/acm/problem/14247
给定一个长度为n的整数数组,问有多少对互不重叠的非空区间,使得两个区间内的数的异或和为0。

异或前缀和

序列[5,1,1]
pre[1]=5 pre[2]=5^1 pre[3]=5^1^1
区间[2,3]的异或则=pre[3]^pre[1]=5^1^1^5 , 即去掉pre[1]

本题

思路在代码注释

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int pre[10004], cnt[3000006];
int main()
{
    int n;
    scanf("%d", &n);
    memset(cnt, 0, sizeof(cnt));
    pre[0] = 0;
    for (int i = 1; i <= n; i++) {
        int x;
        scanf("%d", &x);
        pre[i] = pre[i - 1] ^ x;
        //cout << pre[i] << endl;
    }

    ll sum = 0;
    for (int i = 1; i <= n; i++) {//枚举右端点
        //printf("i=%d\n", i);
        for (int j = i; j > 0; j--) {
            //cout << (pre[i] ^ pre[j - 1]) << endl;
            cnt[pre[i] ^ pre[j - 1]]++;//左边区间[j,i]的异或和pre[i] ^ pre[j - 1]记录下来
        }
        for (int j = i; j < n; j++)
            sum += cnt[pre[i] ^ pre[j + 1]];//看看左边有多少个等于右边区间[i+1,j+1]的异或和pre[i] ^ pre[j + 1],更左边的比如此时i=3,(1,1)在i=1时已经统计进去了
    }

    printf("%lld\n",sum);

    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 15:58
投个小米提前批试试水,先投一个岗位看看形势,不行就再沉淀一下投第二个岗位,莫辜负
Java抽象带篮子:我嘞个骚刚,已经开始研发6g了吗
投递小米集团等公司7个岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-09 12:05
点赞 评论 收藏
分享
06-12 10:50
门头沟学院 Java
你的不定积分没加C:我怎么在学院群看到了同样的话
点赞 评论 收藏
分享
码农索隆:单休一个月少休息4天,一年就是48天,平时节假日,别人3天假期,单休的两天
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务