AcWing3485. 最大异或和

news2024/9/25 12:32:49

先看题目:

说实话,我看到这道题就想用滑动窗口,但是滑了一下发现不太对啊,如果我用滑动窗口的话,那么最后肯定是一个固定长度为m的窗口在持续计算,区间长度小于m的区间的异或和肯定会被遗漏。然后我就想怎么用Trie树来解决这道题,但是我没想明白呜呜呜。

所以前去看了y总的视频题解。

先大致说一下什么是Trie树好了,Trie也叫字典树,它的核心就是通过存储不同字符串的公共前缀来减少查找字符串的时间。

 

看图,对于abuse和about这两个字符串,我们想把他们放到Trie树种,发现他们俩有共同的前缀ab,所以就在b后面开始分叉,然后各走各的分叉。

这道题就是在这个基础上做的。

然后这道题求的是区间的异或和,所以我们还得知道异或的一个特性。我们遍历数组,计算每个前缀的异或和,如果我们想要计算一个区间[i,j]的异或值,那么我们就可以用s[i,j]=s[j]^s[i - 1]求取。为什么可以这么算呢?这是因为一个数和本身异或,结果为0.

好,又一个知识点出来了。

那么现在开始看题:

因为数据范围是2^31-1,那么异或和也最多是31位二进制,也就是说最多是31位二进制就能表示每个数字,那么从0到30就对应异或和的二进制位。

先不考虑区间长度最大为M,我们要找到的是最大的异或和,怎么怎么找呢?

目前我们在Trie树中存储了j以前的前缀异或和,如果想找到一个前缀异或和s[i]和s[j]的异或结果最大的话,应该怎么处理呢?

我们知道异或的计算方法:1^0 = 1, 0 ^ 0 = 0, 1 ^ 1 = 0;那么现在我们有一个s[j],想得到一个和它异或后的最大结果,就要保证最高位尽可能地不同。

假如s[j] = 10101001,那么我们在遍历这棵Trie树的时候,希望能够找到最高位为0的节点,这样才能使异或结果的最高位为1,如果找不到为0的节点,那么只好找最高位为1的节点,尽量保证接下来遍历的节点和s[j]的异或结果为1好了。

这个就是当区间长度不限时我们的计算方式,但是现在题目要求长度最大为M,怎么办呢?去Trie树中删掉吗,好像有点难呢。我们在这里采用伪装删除的方法,用cnt记录经过这个节点的元素的个数。如果要删除某个元素,那么就找到这个元素对应的最后一个结束节点,把它的cnt值-1好了。所以如果我们发现当前遍历到了i>m的前缀异或,为了保证窗口中最多有m个异或和,我们必须删除最前面的异或和,也就是s[i - m - 1]这个异或和了。

 

代码来喽:

#include<iostream>
#include<cstdio>
#include<vector>
#include<map>
#include<cmath>
#include<cstring>
#include<algorithm>
//#define ll long long
const int N = 100010 * 31;  //最多是1e5,每个数最多31位,所以最多一共31*1e5个节点
int cnt[N];
int s[N];  //前缀异或和 
int son[N][2];
int idx;
using namespace std;
void insert(int x, int v){
	int p = 0;
	for(int i = 30; i >= 0; i--){  
		int u = (x >> i) & 1;
		//如果当前节点没有这个分叉,那么我们就新建一个分叉,这个idx可以认为是不同分叉的编号
		//用这个idx可以获取到每个分叉,然后就可以从这个分叉接着往下走了
		if(!son[p][u]) son[p][u] = ++idx;  
		p = son[p][u];  //从这个分叉往下走
		cnt[p] += v;  //经过这个分叉的元素的个数+1或者-1,增加一个元素或者删除一个元素
	} 
} 
int query(int x){
	int res = 0;
	int p = 0;
	for(int i = 30; i >= 0; i--){ //一定要从最高位开始往下,因为我们希望能够保证最高位最大 
		int u = x >> i & 1;
		if(cnt[son[p][!u]]) {  //能够保证和当前位不同,异或结果为1
			p = son[p][!u];
			//在整理这个异或和,当前位异或值为1,可以认为之前的结果为res,
			//现在在res后面又加了一位1,那么现在的结果就是res*2+1
			res = res * 2 + 1;  
		}
		else {
			p = son[p][u];
			res = res * 2;
		}
	}
	return res; 
}
int main(){
	int n, m;
	scanf("%d%d", &n, &m);
	int x;
	for(int i = 1; i <= n; i++){
		scanf("%d", &x);
		s[i] = s[i - 1] ^ x; 
	}
	int res = 0;
	insert(s[0], 1);  //1代表插入一个数
	for(int i = 1; i <= n; i++){
	     //删除最前面的元素,例如当i = m+1,那么就把s[0]删除,因为他不在长度为m的窗口内部了。
	     //现在树中有
		if(i > m) insert(s[i - m - 1], -1); 
		res = max(res, query(s[i]));  //找到和s[i]异或后的最大结果
		insert(s[i], 1); //别忘了把这个添加到树中
	} 
	printf("%d\n", res);
	return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/376469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue前端架构说明书模板示例

目录 1. 技术说明... 2 1.1 版本明细... 2 1.2 核心技术介绍... 2 2. 项目结构说明... 3 3. 自动化部署设置说明... 5 4. 打包及运行说明... 5 5. 导包说明... 6 5.1 方案一... 6 5.2 方案二... 7 5.3 补充说明... 7 6. 修改本地运行时链接的服务器说明... 7 7. 常…

从 B 站出发,用 Chrome devTools performance 分析页面如何渲染

页面是如何渲染的&#xff1f;通常会得到“解析 HTML、css 合成 Render Tree&#xff0c;就可以渲染了”的回答。但是具体都做了些什么&#xff0c;却很少有人细说&#xff0c;我们今天就从 Chrome 的性能工具开始&#xff0c;具体看看一个页面是如何进行渲染的&#xff0c;以及…

视频传输协议详解(RTMP、RTSP、HLS)

RTMP——Real Time Messaging Protocol&#xff08;实时消息传输协议&#xff09;RTMP是由Adobe公司提出的&#xff0c;在互联网TCP/IP五层体系结构中应用层&#xff0c;RTMP协议是基于TCP协议的&#xff0c;也就是说RTMP实际上是使用TCP作为传输协议。TCP协议在处在传输层&…

sql学习一

文章目录一、if 语句二、去重问题三、concat,upper,lower四、group_concat五、like 模糊匹配六、union和union all七、流程控制语句case八、limit一、if 语句 if(expr1, expr2, expr3)当expr1的值为真时函数的返回值为expr2&#xff0c;当expr1的值为假时&#xff0c;函数的返…

安装redis并设置开机自启动允许远程链接

一、进入/usr/local目录下面&#xff1b;下载redis包wget https://download.redis.io/releases/redis-5.0.14.tar.gz二、安装gccyum install gcc-c三、解压、进入目录、编译tar -xvf redis-5.0.14.tar.gzcd redis-5.0.14make ##如果报错zmalloc.h:50:31: 致命错误&#xff1a;j…

打破单片机开发模式--胶水语言(JavaScript)

概述 传统的嵌入式单片机开发基本上形式如下图&#xff1a; 该流程对于功能单一或者功能变更极少的场景是比较友好的&#xff0c;但是对于设备应用层变更比较多或者公板方案开发应用的场景&#xff0c;上述场景显的有些累赘。那么有什么方式可以解决呢&#xff1f;&#xff1f…

U-Boot 之七 详解 Driver Model 架构、配置、命令、初始化流程

U-Boot 在 2014 年 4 月参考 Linux Kernel 的驱动模型设计并引入了自己的 Driver Model&#xff08;官方简称 DM&#xff09; 驱动架构。这个驱动模型&#xff08;DM&#xff09;为驱动的定义和访问接口提供了统一的方法&#xff0c;提高了驱动之间的兼容性以及访问的标准性。 …

和月薪3W的聊过后,才知道自己一直在打杂...

前几天和一个朋友聊面试&#xff0c;他说上个月同时拿到了腾讯和阿里的offer&#xff0c;最后选择了阿里。 我了解了下他的面试过程&#xff0c;就一点&#xff0c;不管是阿里还是腾讯的面试&#xff0c;这个级别的程序员&#xff0c;都会考察项目管理能力&#xff0c;并且权重…

[牛客网] HJ35 蛇形矩阵(写了好久才写出来)

链接https://www.nowcoder.com/practice/649b210ef44446e3b1cd1be6fa4cab5e?tpId37&tqId21258&rp1&ru/exam/oj/ta&qru/exam/oj/ta&sourceUrl%2Fexam%2Foj%2Fta%3Fdifficulty%3D2%26page%3D1%26pageSize%3D50%26search%3D%26tpId%3D37%26type%3D37&dif…

区块链行业遭供应链攻击,上万加密钱包被“抄底”损失上亿美元

当地时间8月2日晚间&#xff0c; 区块链行业遭遇了一次行业重创 。据科技媒体TechCrunch报道&#xff0c; 若干名攻击者“抄底”了上万个加密钱包&#xff0c;钱包内有价值上亿美元的代币。 据了解遭受攻击的加密钱包包括Phantom、Slope和TrustWallet等。涉及到的币种除了SOL、…

Vue2的tsx开发入门完全指南

本篇文章尽量不遗漏重要环节&#xff0c;本着真正分享的心态&#xff0c;不做标题党 下面进入正题&#xff1a; 由于现在vue的官方脚手架已经非常完善我们就不单独配置webpack了&#xff0c;节省大量的时间成本。 首先使用vue/cli创建一个vue模版项目&#xff08;记得是vue/…

Dockerfile详解

一、能干嘛&#xff1f; 我们总会遇到下面这种情况&#xff1a;使用docker pull 拉取下来的镜像发现其提供的功能并不完善&#xff0c;比如拉下来个centos的镜像&#xff0c;运行该镜像生成容器发现连vim&#xff0c;ifconfig命令都没有&#xff01;想要在该镜像的基础上扩充其…

[SQL]增删查改语法概览

数据定义 基本概念 基本表 本身独立存在的表SQL中一个关系就对应一个基本表一个(或多个)基本表对应一个存储文件一个表可以带若干索引 存储文件 物理结构对用户透明索引存放在存储文件中 视图 从一个或几个基本表导出的表数据库中至存放数据的定义而不存放视图对应的数据视…

Moonlight iPad全屏无边框串流方法

环境&#xff1a;iPad MoonLight 串流PC 问题&#xff1a;iPad无法全屏&#xff0c;有边框 解决办法&#xff1a;将电脑分辨率和MoonLight自定义分辨率调整为iPad原始分辨率 背景&#xff1a;在使用iPad进行MoonLight串流PC游戏时&#xff0c;发现客户端不论如何设定iPad都有边…

SQL函数

SQL函数 DATE_SUB()函数 1.1函数语法定义 1.2函数实际应用&#xff1a; 语法: 获取当前日期&#xff1a;select curdate()获取当前日期前一天&#xff1a;select date_sub(curdate(),interval 1 day)获取当前日期后一天&#xff1a;select date_sub(curdate(),interval -1 …

mysql(一) 使用注意事项及优化

初学mysql的时候、写了一份 "什么是CRUD&#xff1f; CRUD的操作" 的文章&#xff08;18年的&#xff09; 我开心看到有朋友经常在下面讨论一些问题、 但是以现在&#xff08;今天 23年&#xff09;回头看觉得 那些只是入门需要知道和掌握的、也刚好最近不是很忙 所…

S3C2440开发环境搭建

拿出了之前的S3C2440开发板&#xff0c;然后把移植uboot、移植内核、制作根文件系统、设备树编写驱动等几项再做一遍&#xff0c;这篇文章先记录下环境搭建过程&#xff0c;以及先把现成的uboot、内核、根文件系统下载进去&#xff0c;看看开发板还能不能用&#xff0c;先熟悉一…

【C++】踏入C++的大门(万字总结)

文章目录&#x1f3aa; 踏入C的大门&#x1f680;1.什么是C&#x1f680;2.C发展史&#x1f680;3.C关键字&#x1f680;4.命名空间⭐4.1 命名空间定义⭐4.2 命名空间使用⭐4.3 C输入和输出&#x1f680;5.缺省参数⭐5.1 缺省参数概念⭐5.2 缺省参数分类&#x1f680;6.函数重载…

Unreal Engine10:Character的实现

写在前面 这里主要是介绍一下Character的实现&#xff0c;顺带也介绍一下UE4资源的获取&#xff1b; 一、UE4资源获取 1. 地图的获取 1.1 下载资源 在Epic Games Launcher的虚幻商城中搜索内容&#xff0c;带有环境标签的就主要是地图资源&#xff1b;有一些是免费的资源和…

C#--耗时操作实现UI界面实时更新不阻塞(耗时操作解决窗体卡顿)

前言C#实现窗体加载进度条或者百分比实时显示耗时操作的进度&#xff0c;方法有很多。但是经过我的学习、查找与实际应用&#xff0c;发现Task配合MethodInvoker最为高效便捷。下面我就来结合代码讲一下要注意的问题。基础知识C#在winform上进行耗时操作往往会放置progressbar&…