题意:
给定长度为n的序列,
问有多少个长度为为偶数的区间[L,R]
满足[L,mid]与[mid+1,R]的异或和相同
数据范围:n<=3e5
解法:
根据异或的性质,其实就是找长度为偶数且异或和为0的区间数量
计算异或前缀和,用map分奇偶存异或前缀和的数量即可
当S(L-1)和S( R)的异或和相同,且L-1和R的奇偶性相同,则ans++
ps:
傻逼了,一直在想区间中点问题,然后卡住了。
实际上区间异或和为0,那么前一半的异或和是肯定等于后一半的异或和的0.0
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=3e5+5;
int a[maxm];
int ans;
int n;
signed main(){
ios::sync_with_stdio(0);
cin>>n;
map<int,int>mark[2];
for(int i=1;i<=n;i++){
cin>>a[i];
}
mark[0][0]++;
int s=0;
for(int i=1;i<=n;i++){
s^=a[i];
ans+=mark[i%2][s];
mark[i%2][s]++;
}
cout<<ans<<endl;
return 0;
}