【每日一题】36. 小AA的数列 (二进制DP)
补题链接:Here
算法涉及:位运算,DP
这道题想了很久但实在没想什么巧妙的解法,暴力的代码就不放,这里引用Kur1su 的思路
异或问题优先考虑二进制位,对于这个问题,我们需要考虑偶数长度的区间,那么先对 \([L, R]\) 做处理,因为如果 \(L,R\) 是奇数其实加一/减一没有区别。然后处理一下前缀异或和, 因为我们有性质 \(sum[l, r] = sum[r] \oplus sum[l - 1]\)。最后我们要找到哪些是有贡献的,我们考虑枚举右端点,如果当前点的异或是 1,那么需要在前面找异或为 0 的点才有贡献,反之如果当前点的异或是 0,那么要在前面找异或为 1 的点才有贡献,此外,奇数下标要找奇数下标,偶数下标要找偶数下标,才能构成偶数长度区间。
所以我们可以用 \(dp[i][j]\) 维护前面符合条件的状态数,第一维表示当前位为 \(0/1,\) 第二维表示当前下标为 奇/偶的状态数,直接计算贡献即可。
using ll = long long;
const int N = 1e6 + 10, mod = 1e9 + 7;
int a[N];
void solve() {
int n, l, r; cin >> n >> l >> r;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
a[i] ^= a[i - 1];
}
if (l & 1) l++; // 保证区间为偶数长度
if (r & 1) r--; // 保证区间为偶数长度
if (l > r) { cout << 0; return ;}
ll ans = 0;
for (int i = 0; i < 32; ++i) { // 二进制运算
ll p = (1ll << i);
ll dp[2][2] = {0};
ll num = 0;
for (int j = l; j <= n; ++j) {
dp[(a[j - l] >> i) & 1][(j - l) & 1]++;
num += dp[((a[j] >> i) & 1) ^ 1][j & 1];
num %= mod;
if (j >= r)dp[(a[j - r] >> i) & 1][(j - r) & 1]--;
}
ans += num * p % mod;
ans %= mod;
}
cout << ans;
}
【每日一题】36. 小AA的数列 (二进制DP)的更多相关文章
- 【ACM算法竞赛日常训练】DAY16【奇♂妙拆分】【区区区间间间】【小AA的数列】数学 | 位运算 | 前缀和
DAY16共3题: 奇♂妙拆分(简单数学) 区区区间间间(单调栈) 小AA的数列(位运算dp) 作者:Eriktse 简介:19岁,211计算机在读,现役ACM银牌选手力争以通俗易懂的方式讲解算法!️ ...
- Wannafly挑战赛4 B,小AA的数列
题意:求子区间异或和,要求区间长度在l到r之间,并且为偶数 题解:对于每一位算贡献,可以分奇偶来记录,计算的时候只加上奇偶性相同的就保证了为偶数,从大于l的点开始每次++,从大于r的点每次--,记录二 ...
- 老男孩IT教育-每日一题汇总
老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ...
- CISP/CISA 每日一题 18
CISSP 每日一题(答)What is the purpose of an access review and audit? Checkto ensure that users do not hav ...
- CISP/CISA 每日一题 六
CISA 每日一题(答) 采用电子数据交换 EDI 的好处: 1.较少的书面工作: 2.较少的信息交换错误: 3.改善了数据库到数据库.公司到公司的信息流: 4.没有多余的数据重新键入: 5.较少的通 ...
- 【剑指Offer】简单部分每日五题 - Day 1
今天开始更新leetcode上<剑指Offer>的题解,先从简单难度开始.预计按下列顺序更新: 简单难度:每日5题 中等难度:每日3题 困难难度:每日1题 17 - 打印从1到最大的n位数 ...
- 【JavaScript】Leetcode每日一题-平方数之和
[JavaScript]Leetcode每日一题-平方数之和 [题目描述] 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c . 示例1: 输入:c = 5 ...
- [LeetCode每日一题]80. 删除有序数组中的重复项 II
[LeetCode每日一题]80. 删除有序数组中的重复项 II 问题 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度. 不要使用额外 ...
- 【python】Leetcode每日一题-最大数
[python]Leetcode每日一题-最大数 [题目描述] 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数. 注意:输出结果可能非常大,所以你需要返回一个 ...
- 【python】Leetcode每日一题-丑数2
[python]Leetcode每日一题-丑数2 [题目描述] 给你一个整数 n ,请你找出并返回第 n 个 丑数 . 丑数 就是只包含质因数 2.3 和/或 5 的正整数. 示例1: 输入:n = ...
随机推荐
- 时间复杂度为 O(nlogn) 的排序算法
归并排序 归并排序遵循分治的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后合并这些子问题的解来建立原问题的解,归并排序的步骤如下: 划分:分解待排序的 n 个元素的 ...
- 本地数据备份与FTP远程数据迁移
数据是电脑中最重要的东西.为了保证数据安全,我们经常会对数据进行备份.之前一直采用将重要数据拷贝至移动硬盘的方式实现备份,实现简单但每次都需要把所有文件拷贝一次,当文件很大时效率较低. 因此,考虑使用 ...
- windows端口被占用怎么办?
简单只需要按照一下命令查找到对应的端口kill掉就好了 1.查看本机所有的端口信息 netstat -ano 2.查看本机指定端口信息 netstat -ano | findstr "端口号 ...
- 从 ECMAScript 6 角度谈谈执行上下文
大家好,我是归思君 起因是最近了解JS执行上下文的时候,发现很多书籍和资料,包括<JavaScript高级程序设计>.<JavaScript权威指南>和网上的一些博客专栏,都是 ...
- crictl命令
containerd提供了ctr命令行用于镜像管理容器,但功能比较简单 所以一般会用k8s提供的crictl命令. 该命令的特点是:只要符合K8S的CRI接口的,都可以使用. 另外一点就是,cricr ...
- ASR项目实战-前处理
本文深入探讨前处理环节. 首先介绍一些基本的名词,比如 文件名后缀 文件格式 音频格式 采样率和位深 预备知识 文件名后缀.文件格式和音频格式 常见的音频文件,比如.wav..mp3..m4a..wm ...
- 如何清理Docker不用的Volume
有一句老话叫:书到用时方恨少. 其实电脑的内存空间也是非常宝贵,特别是MacOS下的docker可以分配的空间更是寸土寸金. 在21年的时候我也遇到过类似的问题,当时的经历记录在这篇博客:https: ...
- Python——第一章:注释、变量、常量
python中的注释有2种: 1.单行注释 单行注释用# #这是一个单行注释 快捷键用Ctrl+/全选多个内容可以多行快速注释,也可以快速去掉注释符# 比如快速将全选的所有行注释掉--加# 2.多行注 ...
- SQL注入上传文件获取shell
SQL注入写文件的三个必要条件 Web目录有读写权限: 当目标网站的Web目录具有读写权限时,攻击者可以通过注入恶意SQL语句将恶意文件写入服务器上的Web目录. 知道文件的绝对路径: 攻击者需要知道 ...
- Pikachu漏洞靶场 RCE(远程命令执行/代码执行)
RCE 文章目录 RCE 概述 exec "ping" exec "eval" 概述 RCE(remote command/code execute),远程命令 ...