每日一题:Xorto

Xorto

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

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

思路:
1:首先要知道异或前缀和sum[i]^sum[j-1] = a[j]^a[j+1]^...^a[i],所有这样我们就可以求出每个区间的异或和。
2:异或和为零则说明两个区间的异或和相等。
3:因为这题要求的区间不能覆盖,所有我们每次以i为基点去查找以i为右端点的区间的异或和有多少个,然后再查找以i为左端点的区间异或和有多少个,再看其中相等的区间异或和有多少个。
4:用map去查找相等的有多少个。

#include <bits/stdc++.h>
#include <iostream>
#define LL long long
using namespace std;

int a[1005];
LL sum[1005];
map<LL,LL>s;
int main()
{
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++){
          cin >> a[i];
          sum[i] = (sum[i - 1] ^ a[i]);
    }    
    LL ans = 0;
    for(int i = 1; i <= n; i++){
        for(int j = 0; j < i; j++){
            s[sum[j] ^ sum[i]]++;
        }
        for(int k = i + 1; k <= n; k++){
            ans += s[sum[i] ^ sum[k]];
        }
    }
    cout << ans;
    system("pause");
    return 0;
}
全部评论

相关推荐

昨天 13:29
已编辑
湖南铁道职业技术学院 后端
小红书 后端选手 n*16*1.18+签字费期权
点赞 评论 收藏
分享
勇敢的联想人前程似锦:如果我是你,身体素质好我会去参军,然后走士兵计划考研211只需要200多分。
点赞 评论 收藏
分享
一颗宏心:华为HR晚上过了十二点后还给我法消息。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务