题目描述: 给定m个区间,每个区间l,r,询问这个区间里有多少个子区间的异或和等于k 本蒟蒻代码:
#include<bits/stdc++.h>
#define int long long
#define N 200005
using namespace std;
struct node{
int l,r,id;
}q[N];
int n,m,k,a[N],pos[N],sum,ans[N],cnt[N];
bool cmp(node a,node b){
if(pos[a.l]^pos[b.l]) return a.l<b.l;
else {
if(pos[a.l]&1) {
return a.r>b.r;
}else{
return a.r<b.r;
}
}
}
void add(int x){
sum+=cnt[x^k];
cnt[x]++;
}
void del(int x){
cnt[x]--;
sum-=cnt[x^k];
}
signed main(){
scanf("%lld %lld %lld",&n,&m,&k);
int block=sqrt(n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
a[i]=a[i-1]^a[i];
}
for(int i=1;i<=n;i++) pos[i]=(i-1)/block+1;
for(int i=1;i<=m;i++){
int x,y;
scanf("%lld %lld",&x,&y);
q[i]={x,y,i};
}
sort(q+1,q+1+m,cmp);
cnt[0]=1;
int l=1,r=0;
for(int i=1;i<=m;i++){
while(l<q[i].l) del(a[l++]);
while(r<q[i].r) add(a[++r]);
while(l>q[i].l) add(a[--l]);
while(r>q[i].r) del(a[r--]);
ans[q[i].id]=sum;
}
for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);
return 0;
}
阳历: 6 2 3
1 2 1 1 0 3
1 6
3 5
输出:
7
0
请大佬调代码!!!QWQ