AtCoder Regular Contest 098 D Xor Sum2
题意分析
给出一个序列 A1…An A 1 … A n 求其中有多少对 <l,r> < l , r > <script type="math/tex" id="MathJax-Element-4"> </script> 满足 Al xorAl+1 …xorAr=∑rlAi A l x o r A l + 1 … x o r A r = ∑ l r A i
最直接的思路,区间内要保证每位1只有1个,暴力统计,时间复杂度 O(n) O ( n ) ,常数比较大,20+
下面考虑用dp的思想
维护一个sum,如果sum ^ a[r] != sum + a[r],这说明新加入的值不能保证 <l,r> < l , r > <script type="math/tex" id="MathJax-Element-7"> </script>区间有题中所说性质,删除掉a[l],继续检查之前的性质是否满足,若不满足l自增。当 l==r l == r 的时候是一定满足题目性质的。
每次统计答案即可,注意答案用long long。
代码总览
#include<bits/stdc++.h>
using namespace std;
const int nmax = 2e5 + 100;
int a[nmax];
int main() {
// freopen("in.txt","r",stdin);
int n; scanf("%d", &n);
int l = 1;
long long 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;
}