Xor and Sum
之前做过一道异或的。感觉有点眼熟,发现不是。由于对异或一点也不熟悉。所以直接放弃了
首先写出来几项看看。
a: 1 2 4 1 1 2 4
prex : 1 3 7 6 7 5 1
prey: 1 3 7 8 9 11 15
可以发现如果区间异或和==区间和,那么缩小区间还是一样的。如果!=,那么扩大区间也是一样的。
所以可以枚举左端点,然后计算区间个数。
如果当前p和i满足,p++就是缩小区间,明显满足,所以可以省去,得出结果I-p。如果不满足,就找到一个满足点。当i=p,肯定满足。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=2e5+10; 4 5 int prex[maxn],prey[maxn]; 6 7 int main() { 8 int n; 9 while(~scanf("%d",&n)) { 10 for(int i=1;i<=n;i++) { 11 int x; 12 scanf("%d",&x); 13 prex[i]=prex[i-1]^x; 14 prey[i]=prey[i-1]+x; 15 } 16 int p=0; 17 long long ans=0; 18 for(int i=1;i<=n;i++) { 19 while((prex[i]^prex[p])!=prey[i]-prey[p]) p++; 20 ans+=i-p; 21 } 22 printf("%lld\n",ans); 23 } 24 }
原文:https://www.cnblogs.com/ACMerszl/p/10697930.html