https://www.luogu.org/problemnew/show/P4462
http://codeforces.com/problemset/problem/617/E
这个是莫队裸题了吧。。。
然而,注意:
1.答案开longlong
2.要用桶来代替map/unordered_map,不然会T;桶的大小要大于两倍值域(这是较松的上限,实际上限就是值域内两个数异或能得到的最大值,大概就是值域转换成二进制后每一位变成1后再转回十进制得到的值吧)
CF
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 using namespace std; 5 typedef long long LL; 6 int sum[100100]; 7 int l=1,r=0,blo,n,m,k;LL ans; 8 int s1[2000100],s2[2000100]; 9 struct Q 10 { 11 int l,r,num;LL ans; 12 }q[100100]; 13 bool operator<(const Q &a,const Q &b) 14 { 15 return ((a.l-1)/blo==(b.l-1)/blo)?a.r<b.r:a.l<b.l; 16 } 17 bool cmp(const Q &a,const Q &b) 18 { 19 return a.num<b.num; 20 } 21 void addR() 22 { 23 ++r; 24 s1[sum[r-1]]++;s2[sum[r]]++; 25 ans+=s1[sum[r]^k]; 26 } 27 void delR() 28 { 29 ans-=s1[sum[r]^k]; 30 s1[sum[r-1]]--; 31 s2[sum[r]]--; 32 --r; 33 } 34 void addL() 35 { 36 --l; 37 s1[sum[l-1]]++;s2[sum[l]]++; 38 ans+=s2[sum[l-1]^k]; 39 } 40 void delL() 41 { 42 ans-=s2[sum[l-1]^k]; 43 s1[sum[l-1]]--; 44 s2[sum[l]]--; 45 ++l; 46 } 47 int main() 48 { 49 int i; 50 scanf("%d%d%d",&n,&m,&k);blo=sqrt(n+0.5); 51 for(i=1;i<=n;i++) scanf("%d",&sum[i]),sum[i]^=sum[i-1]; 52 for(i=1;i<=m;i++) scanf("%d%d",&q[i].l,&q[i].r),q[i].num=i; 53 sort(q+1,q+m+1); 54 for(i=1;i<=m;i++) 55 { 56 //printf("%d %d ",q[i].l,q[i].r); 57 while(r<q[i].r) addR(); 58 while(l>q[i].l) addL(); 59 while(r>q[i].r) delR(); 60 while(l<q[i].l) delL(); 61 q[i].ans=ans; 62 } 63 sort(q+1,q+m+1,cmp); 64 for(i=1;i<=m;i++) printf("%lld ",q[i].ans); 65 return 0; 66 }