AtCoder Regular Contest 098 D - Xor Sum 2 区间异或=相加 DP思想

题意:给出n个数,求它的连续子序列中,满足下列公式,(l,r)的对数有多少对

Al xor Al+1 xor … xor Ar=Al Al+1 + … Ar

思路:由题意可以得到,连续子序列,如果在ai这个数不符合公式的话,即之后的符合条件的对数中将不在需要这个元素,所有枚举元素来计算符合公式的对数 。

难以理解的就是异或等效于加法与减法(!!!)

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define N 200005
 5 
 6 ll he[N],yi[N];
 7 
 8 int main()
 9 {
10     ll n,i,x,l,r,ans;
11 
12     while (scanf("%lld",&n)!=EOF)
13     {
14         for (i=1;i<=n;i++)
15         {
16             scanf("%lld",&x);
17             he[i]=he[i-1]+x;//计算加法前缀和 
18             yi[i]=yi[i-1]^x;//计算异或前缀和 
19         }
20 
21         l=1;//左端点 
22         ans=0;
23 
24         for (r=1;r<=n;r++)//以第r个数为结尾进行遍历 
25         {
26             for (;he[r]-he[l-1]!=(yi[r]^yi[l-1]);l++); 
27                 ans+=r-l+1;//l到r的串中共有长度个情况(1个数组成,2个数组成。。。) 
28         }
29         
30         printf("%lld\n",ans);
31         return 0;
32     }
33 
34     return 0;
35 }

猜你喜欢

转载自www.cnblogs.com/hemeiwolong/p/9130384.html