https://www.acwing.com/problem/content/4510/
给定一个长度为 nn 的整数数组 a1,a2,…,ana1,a2,…,an。
请你统计一共有多少个数组 aa 的非空连续子数组能够同时满足以下所有条件:
- 该连续子数组的长度为偶数。
- 该连续子数组的前一半元素的异或和等于其后一半元素的异或和。
例如,当给定数组为 [1,2,3,4,5][1,2,3,4,5] 时,满足条件的连续子数组只有 11 个:[2,3,4,5][2,3,4,5]。
输入格式
第一行包含整数 nn。
第二行包含 nn 个整数 a1,a2,…,ana1,a2,…,an。
输出格式
一个整数,表示满足条件的连续子数组的数量。
数据范围
前三个测试点满足 2≤n≤102≤n≤10。
所有测试点满足 2≤n≤3×1052≤n≤3×105,0≤ai<2200≤ai<220。
输入样例1:
5
1 2 3 4 5
输出样例1:
1
输入样例2:
6
3 2 2 3 7 6
输出样例2:
3
输入样例3:
3
42 4 2
输出样例3:
0
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
//const int N = 3e5;
int n;
long long a[300005];
// int sum[300005];
long long s;
long long ans=0;
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
map<int ,int > p[2];
p[0][0]++;
for(int i=1;i<=n;i++){
s^=a[i];// sum[i]^=a[i]; //此时s是前i个数的异或和
ans+=p[i%2][s];//p[i%2][s]表示当i为偶数是,异或和为s的子数组个数
/*
由于当s第一次出现时,p[i%2][s]=0,因为只有一个,无法满足前一半与后一半相等的情况,
所以此时ans+=0,然后p[i%2][s]=1,当再有s出现时ans才会+1
*/
p[i%2][s]++;
}
cout<<ans<<endl;
return 0;
}