每日一题: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;
}
MDPI公司福利 435人发布