P7003 [NEERC2013]Hack Protection
P7003 [NEERC2013]Hack Protection
题意
给定一个序列 \(a\) ,求有多少个区间满足区间内的数的异或和等于与的和的值。
思路
首先我们求一个异或前缀和 \(s\),对于每一个区间 \([l,r]\) ,它的贡献为区间内按位与的和等于 \(s_r \bigoplus s_{l-1}\) 的段的个数。
设 \(x\) 为某个区间的按位与的和,上面的也就是:
\]
发现,如果我们固定 \(x\) 和 \(s_{l-1}\) ,那么 \(s_r\) 就是固定的,我们就可以求区间内与 \(s_r\) 相等的数的个数来统计答案。
考虑枚举 \(l\) ,发现,对于往后按位与的过程,\(x\) (与上文定义相同)最多会变化 \(\log\) 次,我们就可以将其分为这么多段,然后在 \(s\) 中求与 \(s_r\) 相等的数的个数就可以了。
求每一段的按位与结果,可以记录变成 0 的那一位是什么,或者直接 st 表查询都行。
对于最后一个问题,我们可以用主席树,或者简单地离散化加 vector 上二分即可。
实现
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cctype>
#include<cstring>
#include<cmath>
#include<vector>
#include<utility>
#define int unsigned
using namespace std;
inline int read(){
	int w=0,x=0;char c=getchar();
	while(!isdigit(c))w|=c=='-',c=getchar();
	while(isdigit(c))x=x*10+(c^48),c=getchar();
	return w?-x:x;
}
namespace star
{
	const int maxn=1e5+10;
	int pre[maxn][35],n,a[maxn],b[maxn],s[maxn];
	long long ans;
	vector<int> V[maxn];
	pair<int,int> q[35];
	inline void work(){
		n=read();
		for(int i=1;i<=n;i++) s[i]=read(),a[i]=b[i]=a[i-1]^s[i];
		sort(b+1,b+1+n);
		int cnt=unique(b+1,b+1+n)-b-1;
		for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+1+cnt,a[i])-b;
		for(int i=1;i<=n;i++) V[a[i]].push_back(i);
		for(int j=0;j<31;j++) pre[n+1][j]=n+1;
		for(int i=n;i;i--)
			for(int j=0;j<31;j++)
				pre[i][j]=((s[i]>>j)&1)?pre[i+1][j]:i;
		for(int l=1;l<=n;l++){
			int tot=0,x=s[l];
			q[0].first=l;
			for(int j=0;j<31;j++)
			if((s[l]>>j)&1) q[++tot]=make_pair(pre[l][j],j);
			q[++tot]=make_pair(n+1,0);
			sort(q+1,q+1+tot);
			for(int i=1;i<=tot;i++){
				int y=lower_bound(b+1,b+1+cnt,x^b[a[l-1]])-b;
				if(y<=n and b[y]==(x^b[a[l-1]]))
				ans+=(lower_bound(V[y].begin(),V[y].end(),q[i].first)-lower_bound(V[y].begin(),V[y].end(),q[i-1].first));
				x^=(1<<q[i].second);
			}
		}
		printf("%lld\n",ans);
	}
}
signed main(){
	star::work();
	return 0;
}
												
											P7003 [NEERC2013]Hack Protection的更多相关文章
- 深入浅出UE4网络
		
UE4中的官方文档结构比较混乱,且有部分错误,不方便学习.笔者试图通过本文,整理出一篇关于UE4网络的文章,方便朋友们对UE4中的网络同步部分的认识,并有进一步理解.如有讲得不清楚明白的地方,还望批评 ...
 - 2013 NEERC
		
2013 NEERC Problem A. ASCII Puzzle 题目描述:完成一个拼图. solution 暴搜,但好像挺难打的,但听说因为题目限制比较多,其实很多奇怪的情况都不存在. Prob ...
 - Trying to hack Redis via HTTP requests
		
Trying to hack Redis via HTTP requests Context Imagine than you can access a Redis server via HTTP r ...
 - Excel加密的Sheet如何hack
		
Excel的加密sheet如何hack: 思路:在VBA中添加穷举法模块函数并运行 源代码: Sub PasswordBreaker() 'Breaks worksheet password prot ...
 - Hack 语言学习/参考---1.3 Summary
		
Summary Hack provides the following, non-exhaustive list of features: Ability to annotate function a ...
 - 操作系统内核Hack:(四)内核雏形
		
操作系统内核Hack:(四)内核雏形 在本系列的前一篇文章<操作系统内核Hack:(三)BootLoader制作>中,我们制作出了一个两阶段引导BootLoader,并进入了一个内核的空壳 ...
 - 操作系统内核Hack:(三)引导程序制作
		
操作系统内核Hack:(三)引导程序制作 关于本文涉及到的完整源码请参考MiniOS的v1_bootloader分支. 1.制作方法 现在我们已经了解了关于BootLoader的一切知识,让我们开始动 ...
 - 大众车机天宝187A Hack笔记
		
0×00前言 自从去年买了车,对汽车电子系统的兴趣就上来了.这不,前一阵子逛汽车论坛,发现了有网友将老版本的天宝车机被刷上了2017新帕萨特车机的系统,支持超级蓝牙和苹果CarPlay,百度CarLi ...
 - css常用hack
		
原文地址:css常用hack 突然想起今天早上在CNZZ看到的统计数据,使用IE6.7的用户比例还真多,看到之后我的心都碎了.微软都放弃了为毛还有这么多人不死心? 所以说,IE下的兼容还是得做的. – ...
 
随机推荐
- JSP三大指令是什么?
			
JSP页面中的指令JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言等.语法规则:<%@ 指令名 属性=值 属性=值 ... %>指令可以有很多个属性,它们以键值对的形 ...
 - 练习(time.tick定时器监控数据库)
			
设立个定时器,监控数据库里fb_state(发布状态),并将数据库中一条记录的开始时间与截止时间和当前时间进行比对.若当前时间在开始时间与结束时间之间,则将发布状态设为1,否则为0. 同时,将此段代码 ...
 - [Linux]经典面试题 - 系统管理 - 备份策略
			
[Linux]经典面试题 - 系统管理 - 备份策略 目录 [Linux]经典面试题 - 系统管理 - 备份策略 一.备份目录 1.1 系统目录 1.2 服务目录 二.备份策略 2.1 完整备份 2. ...
 - Qt Creator配置clang-format格式化代码插件
			
clang-format是一种格式化代码的插件,可用于格式化C / C ++ / Java / JavaScript / Objective-C / Protobuf / C#代码.而Qt Creat ...
 - bootstrap validate 验证插件
			
1.需要引入bootstrapValidator.min.js 2.在需要验证的控件中添加 class="form-control" 3.js中写验证的方法 $('#psasave ...
 - 浅读tomcat架构设计之tomcat生命周期(2)
			
浅读tomcat架构设计和tomcat启动过程(1) https://www.cnblogs.com/piaomiaohongchen/p/14977272.html tomcat通过org.apac ...
 - POJ 1279 Art Gallery 半平面交 多边形的核
			
题意:求多边形的核的面积 套模板即可 #include <iostream> #include <cstdio> #include <cmath> #define ...
 - 最大子序和:暴力->递归->动规->线段树
			
题目描述 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. LeetCode:53. 最大子序和 题解 显而易见的暴力解法 最容易想到的便是暴力穷 ...
 - Java hashCode&&equals
			
/** 为保证向Set中添加的对象其所在的类必须要重写hashCode和equals方法: 重写的原则:hashCode和equals尽量保持一致性: 两个相同的对象equals()返回true时,那 ...
 - 想成为Java高手的25个学习目标
			
本文将告诉你学习Java需要达到的25个目标,希望能够对你的学习及找工作有所帮助.对比一下自己,你已经掌握了这25条中的多少条了呢? 1.你需要精通面向对象分析与设计(OOA/OOD).涉及模式(GO ...