已知一个长度为 n 的整数数列 a[1],a[2],…,a[n] ,给定查询参数 l、r ,问在 [l,r] 区间内,有多少连续子
序列满足异或和等于 k 。
也就是说,对于所有的 x,y (l≤x≤y≤r),能够满足a[x]^a[x+1]^…^a[y]=k的x,y有多少组。
标签:clu bzoj sort line width algorithm sla highlight --
#include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> using namespace std; #define N 100050 typedef long long ll; ll ans[N],now; int n,a[N],m,k,h[2000050],pos[N],s[N],size,block,L[N],R[N]; struct A { int id,l,r; }q[N]; bool cmp(const A &x,const A &y) { if(pos[x.l]==pos[y.l]) return x.r<y.r; return pos[x.l]<pos[y.l]; } void del(int x) { h[x]--; now-=h[x^k]; } void add(int x) { now+=h[x^k]; h[x]++; } void solve() { int l=0,r=-1,i; for(i=1;i<=m;i++) { while(l<q[i].l) del(s[l]),l++; while(r>q[i].r) del(s[r]),r--; while(l>q[i].l) l--,add(s[l]); while(r<q[i].r) r++,add(s[r]); ans[q[i].id]=now; } } int main() { scanf("%d%d%d",&n,&m,&k); int i,j; size=sqrt(n); block=n/size; pos[0]=1; for(i=1;i<=block;i++) { L[i]=R[i-1]+1; R[i]=size*i; for(j=L[i];j<=R[i];j++) { pos[j]=i; } } if(R[block]!=n) { block++; for(i=R[block-1];i<=n;i++) pos[i]=block; } for(i=1;i<=n;i++) scanf("%d",&a[i]),s[i]=s[i-1]^a[i]; for(i=1;i<=m;i++) { scanf("%d%d",&q[i].l,&q[i].r); q[i].l--; q[i].id=i; } sort(q+1,q+m+1,cmp); solve(); for(i=1;i<=m;i++) printf("%lld\n",ans[i]); } /* 50 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 35 3 35 */
BZOJ_5301_[Cqoi2018]异或序列&&CF617E_莫队
标签:clu bzoj sort line width algorithm sla highlight --
原文地址:https://www.cnblogs.com/suika/p/8892041.html