题目链接
1 #include <bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4 inline int read()
5 {
6 int x=0,f=1;char ch=getchar();
7 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
8 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
9 return x*f;
10 }
11
12 /********************************************************************/
13
14 const int maxn = 1e5+7;
15 int n, m, k;
16 int a[maxn], belong[maxn];
17 ll ans[maxn], flag[maxn*20]; //注意这里的flag 要大大大大
18 ll now;
19
20 struct node{
21 int l, r;
22 int id;
23 }q[maxn];
24
25 bool cmp(node x, node y){
26 if(belong[x.l] == belong[y.l])
27 return x.r < y.r;
28 return belong[x.l] < belong[y.l];
29 }
30
31 void Update(int x){
32 now += flag[a[x]^k];
33 flag[a[x]]++;
34 }
35
36 void Delete(int x){
37 flag[a[x]]--;
38 now -= flag[a[x]^k];
39 }
40
41 int main(){
42 n = read(); m = read(); k = read();
43 int sz = ceil(sqrt(n));
44 for(int i = 1;i <= n;i++){
45 a[i] = read();
46 belong[i] = (i-1)/sz;
47 }
48 //前缀异或
49 for(int i = 1;i <= n;i++){
50 a[i] = a[i-1]^a[i];
51 }
52 for(int i = 1;i <= m;i++){
53 q[i].l = read(); q[i].r = read();
54 q[i].id = i;
55 }
56 sort(q+1, q+1+m, cmp);
57 int l = 1, r = 0;
58 now = 0;
59 flag[0] = 1;
60 for(int i = 1;i <= m;i++){
61 int id = q[i].id;
62
63 //while里面的顺序是不能随意更改的
64 while(l < q[i].l){
65 Delete(l-1);
66 l++;
67 }
68 while(l > q[i].l){
69 l--;
70 Update(l-1);
71 }
72 while(r < q[i].r){
73 r++;
74 Update(r);
75 }
76 while(r > q[i].r){
77 Delete(r);
78 r--;
79 }
80 ans[id] = now;
81 }
82 for(int i = 1;i <= m;i++){
83 cout << ans[i] << endl;
84 }
85 return 0;
86 }