莫队算法。
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; const int maxn=100000+10; int a[maxn],pre[maxn]; long long cnt[20*maxn]; int pos[maxn]; int n,m,k; long long ans[maxn]; long long Ans; int L,R; struct X { int l,r,id; }s[maxn]; bool cmp(const X&a,const X&b) { if(pos[a.l]==pos[b.l]) return a.r<b.r; return a.l<b.l; } int main() { scanf("%d%d%d",&n,&m,&k); int sz=sqrt(n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); pre[i]=(pre[i-1]^a[i]); pos[i]=i/sz; } for(int i=1;i<=m;i++) { scanf("%d%d",&s[i].l,&s[i].r); s[i].id=i; } sort(s+1,s+1+m,cmp); Ans=0; cnt[pre[s[1].l-1]]++; for(int i=s[1].l;i<=s[1].r;i++) { Ans=Ans+cnt[pre[i]^k]; cnt[pre[i]]++; } L=s[1].l; R=s[1].r; ans[s[1].id]=Ans; for(int i=2;i<=m;i++) { while(L<s[i].l) { cnt[pre[L-1]]--; Ans=Ans-cnt[pre[L-1]^k]; L++; } while(L>s[i].l) { L--; Ans=Ans+cnt[pre[L-1]^k]; cnt[pre[L-1]]++; } while(R<s[i].r) { R++; Ans=Ans+cnt[pre[R]^k]; cnt[pre[R]]++; } while(R>s[i].r) { cnt[pre[R]]--; Ans=Ans-cnt[pre[R]^k]; R--; } ans[s[i].id]=Ans; } for(int i=1;i<=m;i++) printf("%lld ",ans[i]); return 0; }