Sasha and a Bit of Relax(数论,异或)

C. Sasha and a Bit of Relax

链接: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倍区间(前缀和,思维)

你可能感兴趣的:(数论)