题意
一串数字,询问区间内有几个连续的区间异或后为kkk
第一个 莫队算法 挺简单的 果然是优雅的暴力qwq
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN = 2e5+10;
int sz, arr[MAXN], cnt[1<<20];
ll res, ans[MAXN];
int n, q, k;
struct node {
int l, r, id;
}qu[MAXN];
bool cmp(const node &a, const node &b) {
if(a.l/sz == b.l/sz)
return a.r < b.r;
return a.l/sz < b.l/sz;
}
void add(int x) {
res += cnt[arr[x]^k];
cnt[arr[x]]++;
}
void del(int x) {
cnt[arr[x]]--;
res -= cnt[arr[x]^k];
}
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
cin >> n >> q >> k;
sz = (int)sqrt(n);
for(int i = 1; i <= n; ++i) {
cin >> arr[i];
arr[i] ^= arr[i-1];
}
for(int i = 1; i <= q; ++i) {
cin >> qu[i].l >> qu[i].r;
qu[i].id = i;
}
sort(qu+1, qu+1+q, cmp);
int R = 0, L = 1;
cnt[0] = 1;
res = 0;
for(int i = 1; i <= q; ++i) {
while(L < qu[i].l) {
del(L-1);
L++;
}
while(L > qu[i].l) {
L--;
add(L-1);
}
while(R < qu[i].r) {
R++;
add(R);
}
while(R > qu[i].r) {
del(R);
R--;
}
ans[qu[i].id] = res;
}
for(int i = 1; i <= q; ++i) {
cout << ans[i] << endl;
}
return 0;
}