博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ5301:[CQOI2018]异或序列——题解
阅读量:6209 次
发布时间:2019-06-21

本文共 1106 字,大约阅读时间需要 3 分钟。

已知一个长度为 n 的整数数列 a[1],a[2],…,a[n] ,给定查询参数 l、r ,问在 [l,r] 区间内,有多少连续子序列满足异或和等于 k 。
也就是说,对于所有的 x,y (l≤x≤y≤r),能够满足a[x]^a[x+1]^…^a[y]=k的x,y有多少组。

开始时还在想怕不是一棵主席树(滑稽)。

想多了,莫队足以解决。

为了方便求区间异或和,把a处理为前缀异或和。

剩下的看代码吧,不太好说,就是注意左端点的移动是要把它之前的点增/删,因为l~r的异或=a[r]^a[l-1]。

#include
#include
#include
#include
#include
#include
#include
using namespace std;const int N=1e5+5;inline int read(){ int X=0,w=0;char ch=0; while(!isdigit(ch)){w|=ch=='-';ch=getchar();} while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar(); return w?-X:X;}struct qu{ int pos,l,r;}q[N];int a[N],ans[N],cnt[N],sum,n,m,k,s;inline int bel(int x){ return (x-1)/s+1;}bool cmp(qu b,qu c){ return bel(b.l)==bel(c.l)?b.r
q[i].r)del(a[qr--]); while(ql
q[i].l)ql--,add(a[ql-1]); ans[q[i].pos]=sum; } for(int i=1;i<=m;i++)printf("%d\n",ans[i]); return 0;}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客: +

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/9008330.html

你可能感兴趣的文章
SUSE 服务启动概念
查看>>
秒开缓存系统支持的硬件阵列卡
查看>>
C# 环境
查看>>
WinXP、Win7脚本自动加域及用户资料迁移
查看>>
路由表基本知识
查看>>
2011年9月1日:一个值得纪念的日子
查看>>
Always on 孤立用户问题
查看>>
DNS域名服务之:windows server 2008活动目录中的DNS
查看>>
注册表方式开启或关闭本地输入法的解决方案
查看>>
AOP的XML实现方式
查看>>
Office技巧之二 EXCEL设置勾选框
查看>>
vs2008 安装失败
查看>>
13LaTeX学习系列之---LaTeX插入表格
查看>>
yum安装php5.2
查看>>
H3C 配置SSH
查看>>
hive权限控制介绍
查看>>
ios系统中各种设置项的url链接
查看>>
python计算100以内7的倍数和与个数
查看>>
unknown encoding ms936
查看>>
ICMP网络控制信息协议
查看>>