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; }