题意:给你一个数列,问有多少对(l,r)满足A[l]+A[l+1]+...+A[r]=A[l]^A[l+1]^...^A[r]?
标程:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=200005; 5 int n,l; 6 ll ans,sum,a[N]; 7 int main() 8 { 9 scanf("%d",&n);l=1; 10 for (int i=1;i<=n;i++) 11 { 12 scanf("%lld",&a[i]); 13 while ((sum^a[i])!=sum+a[i]) sum^=a[l++]; 14 ans+=i-l+1;sum^=a[i]; 15 } 16 printf("%lld ",ans); 17 return 0; 18 }
题解:性质
有(A+B)-(A^B)=2(A&B)。
由此我们推广一下,按位考虑异或性质,每一位最多只有一个1。或者说,进位加法和不进位加法相等的情况只有不进位的情况。
如果[l,r]区间的加法不进位,那么以r为右端点,左端点在[l,r]中的(l,r)都可行。
新加入一个右端点,那么有可能出现进位,往右移动左端点,使之不进位。由此可见,区间单调。