已知一个长度为 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有多少组。
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5301
题面;
#include<bits/stdc++.h> using namespace std; const int M = 1e5+10; int num[M],a[M],blo,k,ans,b[M]; struct node{ int l,r,id; bool operator < (const node &cmp)const { if(l/blo == cmp.l/blo) return r < cmp.r; return l/blo < cmp.l/blo; } }q[M]; void add(int x){ ans += num[k^a[x]]; num[a[x]]++; } void del(int x){ ans -= num[k^a[x]]; num[a[x]]--; } int main() { int n,m; cin>>n>>m>>k; blo = sqrt(n); for(int i = 1;i <= n;i ++){ cin>>a[i]; a[i] = a[i]^a[i-1]; } for(int i = 1;i <= m;i ++){ cin>>q[i].l>>q[i].r; q[i].l --; q[i].id = i; } sort(q+1,q+m+1); int l = 1,r = 0; ans = 0; for(int i = 1;i <= m;i ++){ while(l < q[i].l) del(l),l++; while(l > q[i].l) l--,add(l); while(r < q[i].r) r++,add(r); while(r > q[i].r) del(r),r--; b[q[i].id] = ans; } for(int i = 1;i <= m;i ++){ cout<<b[i]<<endl; } }
bzoj 5301: [Cqoi2018]异或序列 (莫队算法)
原文:https://www.cnblogs.com/kls123/p/10780309.html