【每日一题】Xorto

图片说明
戳我传送

思路:

前缀和sum[i]保存前i个数的异或值,sum[i]=sum[i-1]^a[i],[L,r]的异或值显然是sum[r]^sum[L-1]。
试着枚举右端点i从1到n,得到以i为右端点的全部全部区间的异或值。
为避免重复可以二分一下,同时枚举全部以i+1为左端点的全部区间的异或值,如果和前面的值相等就加上相等的区间个数。
因为n比较小图片说明 (n^2)可以过。
注意:ans比较大,要开ll

Code:

#include<bits/stdc++.h>
#define  js  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
int a[1005],n,sum[1005],ans;
int mp[200005];
int main() {
    js;
    cin>>n;
    for(int i=1;i<=n;++i) {
        cin>>a[i];
        sum[i]=sum[i-1]^a[i];
    }//前缀和 
    for(int i=1;i<=n;++i) {//枚举右端点, 中点 
        for(int j=1;j<=i;++j)
            ++mp[sum[i]^sum[j-1]];
        for(int j=i+1;j<=n;++j)//枚举后面的区间避免重复 
            ans+=mp[sum[j]^sum[i]];//sum[j]^sum[i]相当于区间[i+1,j]的异或值 
    }
    cout<<ans<<endl;
}
每日一题 文章被收录于专栏

牛客每日一题

全部评论

相关推荐

点赞 评论 收藏
分享
07-15 14:14
门头沟学院 Java
7.10投递7.15感谢信
投递地平线等公司7个岗位
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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