看了UESTC b站的算法小课堂学习的算法(其实是拖了很久每次看都学不进去)
但是自己对于莫队算法的理解还是很浅吖。
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <set>
#include <cmath>
#define LL long long
#define INF 0x3f3f3f3f
#define MOD 998244353
const int maxn = 1 << 20;
using namespace std;
LL n,m,k;
LL l = 1, r = 0;
LL a[maxn];
LL sum[maxn];
LL block[maxn];
LL ans[maxn];
LL ANS = 0;
LL cnt[maxn];
struct node{
LL l,r,id;
}Q[maxn];
bool cmp(node p, node q){
if(block[p.l] == block[q.l])
return p.r < q.r;
return block[p.l] < block[q.l];
}
void del(LL x){
cnt[sum[x]]--;
ANS -= cnt[sum[x]^k];
}
void add(LL x){
ANS += cnt[sum[x]^k];
cnt[sum[x]]++;
}
int main(){
scanf("%lld%lld%lld",&n,&m,&k);
int sz = sqrt(n);
for(int i=1; i<=n; i++){
scanf("%lld",&a[i]);
sum[i] = sum[i-1]^a[i];
block[i] = i / sz;
}
for(int i=1; i<=m; i++){
scanf("%lld%lld",&Q[i].l,&Q[i].r);
Q[i].id = i;
}
sort(Q+1,Q+1+m,cmp);
cnt[0] = 1;
for(int i=1; i<=m; i++){
while(l < Q[i].l){
del(l-1);
l++;
}
while(l > Q[i].l){
l--;
add(l-1);
}
while(r < Q[i].r){
r++;
add(r);
}
while(r > Q[i].r){
del(r);
r--;
}
ans[Q[i].id] = ANS;
}
for(int i=1; i<=m; i++){
printf("%lld\n",ans[i]);
}
}
/*
6 1 3
1 2 1 1 0 3
3 5
*/