[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
以下使用双指针的解题思路:
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<
- return 0;
- }