每日一题: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; }