传送门:点击打开链接
题目大意:给你一个长度为n的整数序列,让你求出满足以下条件的(l, r)的对数:a[l] + a[l+1] + ... + a[r] == a[l] ^ a[l+1] ^ ... ^a[r]
解题思路:官方给出的题解就很给力了,a + b - a ^ b == 2(a & b),即当a & b == 0的时候a + b == a ^ b(其实不知道这个式子也能想出来),然后现在就找一个区间里面能否满足对于一个二进制位置这个区间中所有的数最多在这个位置上只有1个为1.有一些转换看代码,表达能力没那么好....
官方题解传送门:点击打开链接(让我翻译是不可能翻译的啦hh)
tip:ans开long long 否则会爆
代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<vector>
#include<map>
#include<set>
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = (int)2e5 + 5;
const int mod = (int)1e9 + 7;
using namespace std;
int a[maxn];
int main()
{
int n; scanf("%d", &n);
int l = 1;
ll ans = 0, sum = 0;
for(int r = 1; r <= n; r++){
scanf("%d", &a[r]);
while((sum ^ a[r]) != sum + a[r]) sum ^= a[l], l++;
sum ^= a[r];
ans += (r - l + 1);
}
printf("%lld\n", ans);
return 0;
}