链接:C - Sasha and a Bit of Relax
题意:
给一个数组a,
a[l]⊕a[l+1]⊕…⊕a[mid]=a[mid+1]⊕a[mid+2]⊕…⊕a[r],mid=(l+r-1)/2;
问有多少个l,r对可以构成这种等式,只考虑 l-r+1=偶数 的情况
解析:
利用异或的性质:出现偶数次的数异或值为0
如果 a[l]⊕a[l+1]⊕…⊕a[mid]=a[mid+1]⊕a[mid+2]⊕…⊕a[r]
则a[l]⊕a[l+1]...^a[r]==0,问题转化为:找共有多少(l,r)连续异或的结果为0。
长度一定要是偶数个,所以l-1和r要么都是偶数,要么都是奇数
如果当前位置的异或值出现过,并且之前出现的位置与当前出现位置下标的奇偶性相同,这就是所求区间
ans可能超过int范围,用long long
ac:
#include
#define ll long long
#define MAXN 300005
using namespace std;
ll a[MAXN]={0};
ll cnt[2][(1<<20)+3]={0};
int main()
{
ll n,ans=0,sum=0;
cin>>n;
cnt[0][0]=1;
for(ll i=1;i<=n;i++)
{
cin>>a[i];
sum=sum^a[i];
ans+=cnt[i%2][sum];
cnt[i%2][sum]++;
}
cout<
差不多的题:k倍区间(前缀和,思维)