2020牛客寒假算法基础集训营4 D 子段异或

https://ac.nowcoder.com/acm/problem/201639

求一遍异或前缀和,问题转化成有多少对异或前缀和相等

我用的离散化之后树状数组查询

题解大佬直接map。。。。

#include<cstdio>
#include<algorithm>
 
using namespace std;
 
#define N 200001
 
#define lowbit(x) x&-x
 
int m,a[N],has[N];
int c[N];
 
void add(int x)
{
    while(x<=m)
    {
        c[x]++;
        x+=lowbit(x);
    }
}
 
int query(int x)
{
    if(!x) return 0;
    int s=0;
    while(x)
    {
        s+=c[x];
        x-=lowbit(x);
    }
    return s;
}
 
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i) 
    {
        scanf("%d",&a[i]);
        a[i]^=a[i-1];
        has[i]=a[i];
    }
    sort(has+1,has+n+1);
    m=unique(has+1,has+n+1)-has-1;
    int x;
    long long sum=0;
    for(int i=n;i;--i)
    {
        x=lower_bound(has+1,has+m+1,a[i])-has;
        add(x);
        x=lower_bound(has+1,has+m+1,a[i-1])-has;
        if(has[x]==a[i-1]) sum+=query(x)-query(x-1);
    }
    printf("%lld",sum);
    return 0;
}
原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/12300339.html