已知一个长度为 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有多少组。
标签:整数 desc str NPU bsp ext SQ 查询参数 xor
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cmath> 5 #include<algorithm> 6 #define N (500000+100) 7 using namespace std; 8 9 struct node{int x,y,num,id,ans;}ask[N]; 10 int Keg[N],sum[N],n,m,k,x,now; 11 12 bool cmp1(node a,node b){return a.id==b.id?a.y<b.y:a.id<b.id;} 13 bool cmp2(node a,node b){return a.num<b.num;} 14 15 void Ins(int pos){now+=Keg[sum[pos]^k]; Keg[sum[pos]]++;} 16 void Del(int pos){Keg[sum[pos]]--; now-=Keg[sum[pos]^k];} 17 18 int main() 19 { 20 scanf("%d%d%d",&n,&m,&k); 21 int unit=sqrt(n); 22 for (int i=1; i<=n; ++i) 23 scanf("%d",&x),sum[i]=sum[i-1]^x; 24 for (int i=1; i<=m; ++i) 25 { 26 scanf("%d%d",&ask[i].x,&ask[i].y); 27 ask[i].x--; ask[i].num=i; 28 ask[i].id=ask[i].x/unit; 29 } 30 sort(ask+1,ask+m+1,cmp1); 31 32 int l=1,r=0; 33 for (int i=1; i<=m; ++i) 34 { 35 while (l<ask[i].x) Del(l++); 36 while (l>ask[i].x) Ins(--l); 37 while (r<ask[i].y) Ins(++r); 38 while (r>ask[i].y) Del(r--); 39 ask[i].ans=now; 40 } 41 42 sort(ask+1,ask+m+1,cmp2); 43 for (int i=1; i<=m; ++i) 44 printf("%d\n",ask[i].ans); 45 }
标签:整数 desc str NPU bsp ext SQ 查询参数 xor
原文地址:https://www.cnblogs.com/refun/p/8931154.html