CF1592E Bored Bakry

  • description
  • solution
  • code

description

题目链接

solution

and\text{and}and如果第iii位为111,意味着区间内每个数的第iii位都是111

xor\text{xor}xor如果第iii位为111,意味着区间内有奇数个第iii位为111

这种涉及二进制操作的一般都考虑拆位单独处理

从高到低位枚举,在第i位决出胜负

意思是,区间前i−1i-1i−1位and\text{and}and和xor\text{xor}xor的结果一样,在第iii位时,and\text{and}and为111,xor\text{xor}xor为000

那么就需要满足一些判句

  • 区间长度为偶数,且每个数第iii位都为111
  • 前i−1i-1i−1的每一位,区间中为111的个数都必须是偶数

不可能出现

xor:1 1 0 0

and:1 1 0 1

这种数据,因为由and位是1,xor位是0的某个i可以得到,这一定是个偶数长度的区间

那么前面两个and都为1的时候,xor一定不为1

可以用前缀异或和来判定区间111的个数都必须是偶数

  • 具体而言:[1,x][1,x][1,x]的异或和为vvv,找到上一个异或和为vvv的yyy,那么(y,x](y,x](y,x]区间内的前几位每一位区间个数都是偶数了

通过这个同时来判断区间内每个数的第iii位是否都是111,定义Andx:And_x:Andx​: 前xxx个数中第iii位为111的个数

判断Andx−Andy=x−yAnd_x-And_y=x-yAndx​−Andy​=x−y是否成立即可

code

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define maxn 1000005
int n, ans;
int a[maxn], And[maxn], Xor[maxn], lst[maxn];int main() {scanf( "%d", &n );for( int i = 1;i <= n;i ++ ) scanf( "%d", &a[i] );for( int j = 19;~ j;j -- ) {for( int i = 1;i <= n;i ++ ) {And[i] = And[i - 1] + ( a[i] >> j & 1 );Xor[i] ^= ( ( And[i] & 1 ) << j );}memset( lst, -1, sizeof( lst ) );lst[0] = 0;for( int i = 1;i <= n;i ++ ) {if( lst[Xor[i]] == -1 ) lst[Xor[i]] = i;else {int k = lst[Xor[i]];if( And[i] - And[k] == i - k ) ans = max( ans, i - k );else lst[Xor[i]] = i;}}}printf( "%d\n", ans );return 0;
}

CF1592E Bored Bakry(二进制+前缀异或和)相关推荐

  1. CF1592E Bored Bakry

    CF1592E Bored Bakry 题意: 给你长度为n的数组a,现在定义一段区间[l,r]为good,如果al&al+1&...&ar>al⊕al+1⊕...⊕ar ...

  2. 51Nod 2128 前缀异或 c/c++题解

    题目描述 输入一个长度为n(1 <= n <= 100000)数组a[1], a[2], -, a[n]. 输入一个询问数m(1 <= m <= 100000)和m组询问,每组 ...

  3. 【牛客每日一题】 4.13 Xorto(前缀异或和,枚举优化/映射)

    链接:https://ac.nowcoder.com/acm/problem/14247 来源:牛客网 题目描述 给定一个长度为n的整数数组,问有多少对互不重叠的非空区间,使得两个区间内的数的异或和为 ...

  4. 【51nod - 前缀异或】 对前缀和的理解

    题干: 前缀异或  基准时间限制:2 秒 空间限制:131072 KB 分值: 5 输入一个长度为n(1 <= n <= 100000)数组a[1], a[2], ..., a[n]. 输 ...

  5. LeetCode 1829. 每个查询的最大异或值(前缀异或 + 位运算)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 有序 数组 nums ,它由 n 个非负整数组成,同时给你一个整数 maximumBit .你需要执行以下查询 n 次: 找到一个非负整数 k ...

  6. LeetCode 1442. 形成两个异或相等数组的三元组数目(前缀异或)

    1. 题目 给你一个整数数组 arr . 现需要从数组中取三个下标 i.j 和 k ,其中 (0 <= i < j <= k < arr.length) . a 和 b 定义如 ...

  7. CodeForces.1174D.EhabandtheExpectedXORProblem(构造前缀异或和数组)

    题目链接 这道题比赛的时候没做出来,赛后补题的时候发现其实可以构造一个前缀异或和数组,然后根据初始化的第一个值进行填数,但是作为菜鸡的我虽然坚信自己的想法是正确的却想了很久也没有能够构造出来所谓的前缀 ...

  8. 1018. 可被 5 整除的二进制前缀

    链接:1018. 可被 5 整除的二进制前缀 题解: class Solution {public:vector<bool> prefixesDivBy5(vector<int> ...

  9. 前缀异或:XOR Segment (用的是前缀和的思想,所以暂且称这个方法为前缀异或)

    XOR Segment Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total S ...

最新文章

  1. 破解网页禁止使用“复制”、“粘贴“
  2. 解决Matlab Help文档需要登录才能查看的问题
  3. 全球及中国微生物气溶胶采样器行业十四五”发展规划及运营前景研究报告2021年版
  4. SAP已发票校验采购订单退货 - 特殊业务
  5. mac怎么搭建php环境,Mac下快速搭建PHP开发环境
  6. Linux多线程实践(六)使用Posix条件变量解决生产者消费者问题
  7. HTML可以替代CSS的所有功能,CSS-用Divs替换HTML表
  8. requests-session类对象-0223
  9. Mybatis Generator生成工具使用
  10. mysql空间数据类型的使用_MYSQL 空间数据类型用法
  11. c语言程序100例第4题 参考了参考答案
  12. 华硕固件,梅林固件,高恪固件等等有什么区别?
  13. java套接字数据对不上,服务器不从多个客户端(Java套接字)接收数据
  14. Python爬虫教程,利用Python采集QQ群成员信息
  15. Linux系统配置jdk环境变量
  16. Java第二十七篇:二维数组打印九九乘法表(三角形、矩形、菱形)
  17. windows磁盘分区合并(比如合并到C盘/分区扩容)问题/删除恢复分区
  18. ACM大一练习赛-第三场------G - EPR悖论克鲁斯卡尔算法
  19. android 音频播放过程,一种Android系统中的音频播放方法与流程
  20. 数据库CREATE TRIGGER 触发器

热门文章

  1. 还在集什么五福,史上最惨锦鲤再次来袭!奖品堪比5年高考3年模拟!
  2. 月薪多少才算80后中的人生赢家?他们的经济、婚姻、生活方式是怎样的
  3. 国庆中秋活动——超强AR/3D地球仪!带你领略世界风光!我们未必能环游世界,但都该有个地球仪
  4. adb android源码分析,Android源码分析(十六)----adb shell 命令进行OTA升级
  5. 6计算机系统的组成是,计算机系统的组成(范文)(6页)-原创力文档
  6. matlab作业1参考答案,matlab课后习题答案1到6章
  7. 在google play开放平台上closed texting如何删除_“爷青回”!如何抢先体验《英雄联盟》手游?这份攻略送给你...
  8. tankwar java_TankWar 单机(JAVA版) 版本0.3 画出坦克
  9. C语言 time函数 开销,C语言: 函数调用的开销
  10. C++map容器-查找和统计