题意

已知一个长度为 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有多少组。

分析

这样的题目首先按照异或运算前缀和,就变成多次查询区间内有多少对数满足异或和为k.

考虑简单的情况.异或和为0的时候,就变成查询区间内有多少对数相同.这是很显然的莫队题目.

那么异或和为k的时候我们也可以考虑莫队.比较简明的思路是用trie树维护区间内所有的数字,加入/删除数字的时候更新答案.

另一种方式是,把所有的前缀和异或上k,组成另外一个数列,那么对于询问的区间在原先的前缀和数列和异或k的前缀和数列上都有一个数集,然后找两个数集的相同的数对(就是找这样的数对:数值相同,但是一个数在这个数集,另一个数在那个数集).

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100005;
int a[maxn],s1[maxn],s2[maxn];
int cnt1[500000],cnt2[500000],ans;
int SZ=250;
struct query{
int l,r,num,ans;
void read(){
scanf("%d%d",&l,&r);l--;
}
}Q[maxn];
bool cmp1(const query &A,const query &B){
if(A.l/SZ!=B.l/SZ)return A.l<B.l;
return A.r<B.r;
}
void init(int l,int r){
//printf("%d %d\n",l,r); for(int i=l;i<=r;++i){
//printf("%d ",s1[i]);
cnt1[s1[i]]++;
}//printf("\n");
for(int i=l;i<=r;++i){
cnt2[s2[i]]++;//printf("%d ",s2[i]);
ans+=cnt1[s2[i]];
}//printf("\n");
//printf("%d\n",ans);
}
void move(int l1,int r1,int l2,int r2){
for(int i=l1;i<l2;++i){
ans-=cnt2[s1[i]];ans-=cnt1[s2[i]];
cnt1[s1[i]]--;cnt2[s2[i]]--;
if(s1[i]==s2[i])ans+=1;
}
for(int i=l1-1;i>=l2;--i){
ans+=cnt2[s1[i]];ans+=cnt1[s2[i]];
cnt1[s1[i]]++;cnt2[s2[i]]++;
if(s1[i]==s2[i])ans-=1;
}
for(int i=r1+1;i<=r2;++i){
ans+=cnt2[s1[i]];ans+=cnt1[s2[i]];
cnt1[s1[i]]++;cnt2[s2[i]]++;
if(s1[i]==s2[i])ans-=1;
}
for(int i=r1;i>r2;--i){
ans-=cnt2[s1[i]];ans-=cnt1[s2[i]];
cnt1[s1[i]]--;cnt2[s2[i]]--;
if(s1[i]==s2[i])ans+=1;
}
}
int res[maxn];
int main(){
int n,m,k;scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;++i){
scanf("%d",a+i);
}
for(int i=1;i<=n;++i)s1[i]=s1[i-1]^a[i];
for(int i=0;i<=n;++i)s2[i]=s1[i]^k;
for(int i=1;i<=m;++i)Q[i].read();
for(int i=1;i<=m;++i)Q[i].num=i;
sort(Q+1,Q+m+1,cmp1);
init(Q[1].l,Q[1].r);Q[1].ans=ans;
for(int i=2;i<=m;++i){
move(Q[i-1].l,Q[i-1].r,Q[i].l,Q[i].r);
Q[i].ans=ans;
}
if(k==0){
for(int i=1;i<=m;++i)Q[i].ans-=(Q[i].r-Q[i].l+1);
}
for(int i=1;i<=m;++i)Q[i].ans/=2;
for(int i=1;i<=m;++i)res[Q[i].num]=Q[i].ans;
for(int i=1;i<=m;++i)printf("%d\n",res[i]);
return 0;
}

bzoj5301[CQOI2018]异或序列的更多相关文章

  1. BZOJ5301: [Cqoi2018]异或序列(莫队)

    5301: [Cqoi2018]异或序列 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 400  Solved: 291[Submit][Status ...

  2. [bzoj5301][Cqoi2018]异或序列_莫队

    异或序列 bzoj-5301 Cqoi-2018 题目大意:题目链接. 注释:略. 想法: 由于a^a=0这个性质,我们将所有的数变成异或前缀和. 所求就变成了求所有的$l_i\le x<y\l ...

  3. BZOJ5301:[CQOI2018]异或序列(莫队)

    Description 已知一个长度为 n 的整数数列 a[1],a[2],…,a[n] ,给定查询参数 l.r ,问在 [l,r] 区间内,有多少连续子 序列满足异或和等于 k . 也就是说,对于所 ...

  4. 2018.08.12 bzoj5301: [Cqoi2018]异或序列(前缀和+莫队)

    传送门 简单的异或前缀和处理+莫队统计答案. 惊奇的发现无论开不开long long都能跑过... 代码: #include<bits/stdc++.h> #define N 100005 ...

  5. BZOJ5301 [Cqoi2018]异或序列 【莫队】

    题目链接 BZOJ5301 题解 莫队水题 BZOJ400AC纪念 #include<algorithm> #include<iostream> #include<cst ...

  6. bzoj 5301: [Cqoi2018]异或序列 (莫队算法)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5301 题面; 5301: [Cqoi2018]异或序列 Time Limit: 10 Sec ...

  7. 「luogu4462」[CQOI2018] 异或序列

    「luogu4462」[CQOI2018]异或序列 一句话题意 输入 \(n\) 个数,给定\(k\),共 \(m\) 组询问,输出第 \(i\) 组询问 \(l_i\) \(r_i\) 中有多少个连 ...

  8. bzoj 5301 [Cqoi2018]异或序列 莫队

    5301: [Cqoi2018]异或序列 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 204  Solved: 155[Submit][Status ...

  9. 并不对劲的复健训练-bzoj5301:loj2534:p4462 [CQOI2018]异或序列

    题目大意 给出一个序列\(a_1,...,a_n\)(\(a,n\leq 10^5\)),一个数\(k\)(\(k\leq 10^5\)),\(m\)(\(m\leq10^5\))次询问,每次询问给\ ...

随机推荐

  1. python3 面向对象编程--类的封装和继承

    #python3import refrom urllib import requestimport os class PosterSpider(object):     def __init__(se ...

  2. C#数组、js数组、json

    C#数组 参考地址C#之数组 什么是数组?数组是一种数据结构,包含同一个类型的多个元素.数组的声明:int[] myIntArray; 注:声明数组时,方括号 [] 必须跟在类型后面,而不是变量名后面 ...

  3. 第36章 SDIO—SD卡读写测试

    第36章     SDIO—SD卡读写测试 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/f ...

  4. 解决EF使用context.Database.SqlQuery时NotMapped属性列为空null的问题(转载)

    有时候我们要为EF中的Model加一个新属性,这个属性不是数据库中的字段,而是从其它表中关联出来的.EF中要标示一个列不是对应表中字段只需要加上NotMapped特性.要使用NotMapped,保证你 ...

  5. sql语句之表间字段值复制遇到的一些问题--基于mysql

    好久没来园子了,转眼2017已经到3月份了,前段时间一直忙没时间写博客(其实是自己懒),感觉内心好惭愧.昨天临下班前,技术老大突然对我说要改下表结构,问我能不能实现将一个表的字段值复制到另外一个表的某 ...

  6. c# C#获取屏幕鼠标坐标点颜色

    [DllImport("user32.dll")] private static extern IntPtr GetDC(IntPtr hwnd); [DllImport(&quo ...

  7. 20155223 Exp2 后门原理与实践

    20155223 Exp2 后门原理与实践 实验预热 一.windows获取Linux shell Windows:使用 ipconfig 命令查看当前机器IP地址. 进入ncat所在文件地址,输入命 ...

  8. 20155239吕宇轩《网络对抗》Exp3 免杀原理与实践

    20155239吕宇轩<网络对抗>Exp3 免杀原理与实践 实验过程 Kali使用上次实验msfvenom产生后门的可执行文件,上传到老师提供的网址http://www.virscan.o ...

  9. 欧几里得算法(及扩展)&&快速幂(二分+位运算)

    最近在二中苦逼地上课,天天听数论(当然听不懂) 但是,简单的还是懂一点的 1.欧几里得算法 说得这么高级干什么,gcd入门一个月的人都会吧,还需要BB? 证明可参照其他博客(不会),主要就是gcd(a ...

  10. [LCT应用]

    维护动态生成树,建树方法:假设边edge(x,y),则建立x ->edge->y的先后顺序.