题意:

给出一系列数,对每个查询区间,计算有多少个子区间异或为k。

思路:

可以先预处理异或前缀,一个区间[L,R]的异或值=sum[R]^sum[L-1];

如果当前区间是[a,b],加一个右端点b+1,那么这个b+1的贡献就是[a,b]区间内有多少个sum[x]=sum[b+1]^k

那么我们可以每次记录num[sum[x]]即num[sum[b+1]^k],并记录num[sum[b+1]]++,同理左区间。

那么我们就可以使用莫队算法。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=2e6+10;
int sum[N],pos[100010];
LL num[N];
int n,m,k,x;
struct asd{
int left,right,id;
LL res;
}e[100010];
bool cmp(asd x,asd y)
{
if(pos[x.left]==pos[y.left]) return x.right<y.right;
return pos[x.left]<pos[y.left];
}
LL ans; //答案遵守ans先加,再变;先变,ans再减;
void solve()
{
sort(e,e+m,cmp);
ans=0;
memset(num,0,sizeof(num));
int L=0,R=0;
for(int i=0;i<m;i++)
{
while(L<e[i].left-1) //当他在区间左边,他要减去他产生右端
{
num[sum[L]]--; //先变
ans-=num[sum[L]^k]; //答案再减
L++;
}
while(L>=e[i].left) //当他在区间右边,他要加上他右端
{
L--;
ans+=num[sum[L]^k]; //先加答案
num[sum[L]]++; //再变
}
while(R<=e[i].right) //小于,要加左边
{
ans+=num[sum[R]^k]; //先加答案
num[sum[R]]++; //再变
R++;
}
while(R>e[i].right+1) //大,要减左
{
R--;
num[sum[R]]--; //先变
ans-=num[sum[R]^k]; //再减答案
}
e[e[i].id].res=ans;
}
for(int i=0;i<m;i++)
printf("%lld\n",e[i].res);
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
sum[0]=0;
int block=(int)sqrt(n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
sum[i]=sum[i-1]^x;
pos[i]=(i-1)/block+1;
}
for(int i=0;i<m;i++)
{
scanf("%d%d",&e[i].left,&e[i].right);
e[i].id=i;
}
solve();
return 0;
}
/*
6 2 3
1 2 1 1 0 3
1 6
3 5
5 3 1
1 1 1 1 1
1 5
2 4
1 3
*/

最新文章

  1. android基于口令加密快速搞懂(一)
  2. Good Practices to Write Stored Procedures in SQL Server
  3. [CentOS7]安装mysql遇到的问题
  4. 分享一个TP5实现Create()方法的心得
  5. td内元素居顶,td元素不随高度的撑开而变位置
  6. asp.net 分布式缓存
  7. Bootstrap学习之路(3)---列表组件
  8. android 状态栏、标题栏、屏幕高度
  9. WindowsMediaPlayer控件批量添加文件至播放列表
  10. Volley网络请求框架的基本用法
  11. poj3122
  12. 【转】Android TextView SpannableStringBuilder 图文混排颜色斜体粗体下划线删除线
  13. &lt;Win32_16&gt;来看看标准菜单和右键菜单的玩法
  14. 基于visual Studio2013解决C语言竞赛题之0607strcpy
  15. B2B2C商品模块数据库设计
  16. 2016弱校联盟十一专场10.3 We don't wanna work!
  17. InvalidDataAccessResourceUsageException:mysql保留字引发的血案
  18. 【APUE | 03】文件I/O
  19. AI大道理头尾标识
  20. Windows Mobile设备操作演示准备工作小记

热门文章

  1. 【题解】 P5022旅行
  2. &quot;静态方法里仅仅能调用静态变量和静态方法&quot;具体解释
  3. AndroidUI组件之ImageSwitcher
  4. 【shell】shuf命令,随机排序
  5. px sp dp 手机尺寸
  6. Adding Form Fields to a MS Word Document
  7. 51nod 1040
  8. 大数据之路- Hadoop环境搭建(Linux)
  9. DOM (文档对象模型(Document Object Model)
  10. 分布式锁的实现方式——ACID数据库、缓存或者是zk