[ABC098D] Xor Sum 2 【双指针】

[ABC098D] Xor Sum 2 【双指针】
题意翻译
给你一串数 a
求出满足al +…+ ar = al xor…xor ar,(l<=r)的方案数。
1 输入输出样例
输入 #1
4
2 5 4 6
输出 #1
5
输入 #2
9
0 0 0 0 0 0 0 0 0
输出 #2
45
输入 #3
19
885 8 1 128 83 32 256 206 639 16 4 128 689 32 8 64 885 969 1
输出 #3
37
输入 #4
5
1 2 4 3 1
输出 #4
9

样例解析#4:
1: 001
2: 010
3: 011
4: 100

1 = 1
1 + 2 = 1 xor 2
1 + 2 + 4 = 1 xor 2 xor 4
2 = 2
2 + 4 = 2 xor 4
4 = 4
4 + 3 = 4 xor 3
3 = 3
1 = 1

  • 异或和是不进位的加法,有a xor b
  • 搜索区间具有连续伸缩的特性,可以用双指针进行维护。

以下使用双指针的解题思路:
1. i 指针指向 1,j指针指向 0。
2. j 指针做预判,成功则 j++,s1+=a[j],s2^=a[j];循环直到预判失败,退出,j指向合法区间右端;
3. ans+=j-i+1;
4. s1-=a[i],s2^=a[i],i++;

#include 
using namespace std;
long long a[200005],n,ans,s1,s2;
int main()
{	
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	int i=1,j=0;
	while(i<=n){
		while(j+1<=n && (s1+a[j+1])==(s2^a[j+1])){
			j++;s1+=a[j];s2^=a[j];
		}
		ans+=j-i+1;
		s1-=a[i];
		s2^=a[i];
		i++;	
	}
	cout<

你可能感兴趣的:(算法刷题,开发语言,c++,青少年编程,c语言,算法)