题意:给出n个数,找出一个区间【l ,r】,r - l + 1是偶数,并且mid = ( l + r - 1 ) / 2
使得,输出这个对数
思路:由前缀异或和的思路得到,
b
m
i
d
⊕
b
l
−
1
=
b
m
i
d
⊕
b
r
b_{mid} ⊕ b_{l-1} = b_{mid} ⊕ b_r
bmid⊕bl−1=bmid⊕br
约分得到
b
l
−
1
=
b
r
b_{l-1} = b_r
bl−1=br
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <vector>
using namespace std;
#define ll long long
#define eps 0.001
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define memset(a,b) memset(a,b,sizeof(a))
const int MAX=3e5+10;
int a[MAX];
int b[MAX];
ll num[1048576+10][2];
int main()
{
int n,sum1,sum2,l,r,mid;
ll ans=0;
scanf("%d",&n);
memset(num,0);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
b[1] = a[1];
for(int i=2;i<=n;i++)
b[i] = b[i-1] ^ a[i];
num[0][0]=1;
for(int i=1;i<=n;i++){
ans +=num[b[i]][i&1];
num[b[i]][i&1]++;
}
printf("%lld\n",ans);
return 0;
}