【位运算】查询子数组最大异或值|2693

本文涉及知识点

位运算、状态压缩、枚举子集汇总

3277. 查询子数组最大异或值

给你一个由 n 个整数组成的数组 nums,以及一个大小为 q 的二维整数数组 queries,其中 queries[i] = [li, ri]。

对于每一个查询,你需要找出 nums[li…ri] 中任意 子数组 的 最大异或值。

数组的异或值 需要对数组 a 反复执行以下操作,直到只剩一个元素,剩下的那个元素就是 异或值:

对于除最后一个下标以外的所有下标 i,同时将 a[i] 替换为 a[i] XOR a[i + 1] 。
移除数组的最后一个元素。
返回一个大小为 q 的数组 answer,其中 answer[i] 表示查询 i 的答案。

示例 1:

输入: nums = [2,8,4,32,16,1], queries = [[0,2],[1,4],[0,5]]

输出: [12,60,60]

解释:

在第一个查询中,nums[0…2] 的子数组分别是 [2], [8], [4], [2, 8], [8, 4], 和 [2, 8, 4],它们的异或值分别为 2, 8, 4, 10, 12, 和 6。查询的答案是 12,所有异或值中的最大值。

在第二个查询中,nums[1…4] 的子数组中最大的异或值是子数组 nums[1…4] 的异或值,为 60。

在第三个查询中,nums[0…5] 的子数组中最大的异或值是子数组 nums[1…4] 的异或值,为 60。

示例 2:

输入: nums = [0,7,3,2,8,5,1], queries = [[0,3],[1,5],[2,4],[2,6],[5,6]]

输出: [7,14,11,14,5]

解释:

下标 nums[li…ri] 最大异或值子数组 子数组最大异或值
0 [0, 7, 3, 2] [7] 7
1 [7, 3, 2, 8, 5] [7, 3, 2, 8] 14
2 [3, 2, 8] [3, 2, 8] 11
3 [3, 2, 8, 5, 1] [2, 8, 5, 1] 14
4 [5, 1] [5] 5

提示:

1 <= n == nums.length <= 2000
0<=nums[i]<=231−10 <= nums[i] <= 2^{31} - 10<=nums[i]<=2311
1<=q==queries.length<=1051 <= q == queries.length <= 10^51<=q==queries.length<=105
queries[i].length == 2
queries[i] = [li, ri]
0 <= li <= ri <= n - 1

位运算

长度为1的数组异或值:a0a_0a0
长度为2的数组的异或值:a0⊕a1a_0 \oplus a_1a0a1
长度为3的数组的异或值:a0⊕a1⊕a1⊕a2a_0 \oplus a_1 \oplus a_1 \oplus a_2a0a1a1a2a0a12a2a_0 a_1^2 a_2a0a12a2异或两次,相互抵消,即a0a2a0a2a0a2
长度为4的数组的异或值:(a0a1)(a2a3)(a_0a_1)(a_2a_3)(a0a1)(a2a3)a0a1a2a3a_0a_1a_2a_3a0a1a2a3
长度为5的数组的异或值:(a0a1)(a1a2)(a2a3)(a3a4)(a_0a_1)(a_1a_2)(a_2a_3)(a_3a_4)(a0a1)(a1a2)(a2a3)(a3a4)a0a4a_0a_4a0a4
长度为6的数组的异或值:a0a1a4a5a_0a_1a_4a_5a0a1a4a5
长度为7的数组的异或值:a0a2a4a6a_0a_2a_4a_6a0a2a4a6
没有头绪,看题解,有递推式f(0,r)=f(0,r−1)⊕f(1,r)f(0,r)=f(0,r-1)\oplus f(1,r)f(0,r)=f(0,r1)f(1,r),
自己思考的证明。
性质一:f(a)=⨁(ai×bi),bi∈0,1\bigoplus (a_i \times b_i),bi \in{0,1}(ai×bi),bi0,1,因为aia_iai异或两次会抵消。
性质二e[i]=a[i]×c[i]→f(e)==f(a)⊕f(c)e[i]=a[i]\times c[i] \rightarrow f(e)== f(a) \oplus f(c)e[i]=a[i]×c[i]f(e)==f(a)f(c)。如果0==bi,左式和右式都不包括ai,ci;如果1==bi,左右式都包括一个ai,ci。0 == b_i,左式和右式都不包括a_i,c_i;如果1==b_i,左右式都包括一个a_i,c_i。0==bi,左式和右式都不包括ai,ci;如果1==bi,左右式都包括一个ai,ci
性质三:长度n的数组a,操作一次后:
f(a0a1⋯an−1)=f((a0⊕a1)(a1⊕a2)(an−2⊕an−1)f(a_0 a_1 \cdots a_{n-1})=f((a_0 \oplus a_1) (a_1 \oplus a_2) (a_{n-2} \oplus a_{n-1})f(a0a1an1)=f((a0a1)(a1a2)(an2an1),根据性质二递推式得证。

实现

vMax1[left][r] = max⁡f(left⋯r,r)\max f(left\cdots r,r)maxf(leftr,r),递推式 :vMax1[left][r]=max(vMax1[left+1][r],f(left,r))vMax1[left][r] = max(vMax1[left+1][r],f(left,r))vMax1[left][r]=max(vMax1[left+1][r],f(left,r))
vMax[left][r] = max⁡f(left1,r1),left≤left1≤r,left1≤r1≤r\max f(left1,r1),left \le left1 \le r,left1 \le r1 \le rmaxf(left1,r1),leftleft1r,left1r1r vMax[left][r] = max(vMax[left][r-1] ,vMax1[left,r])

代码

核心代码

class Solution {public:vector<int> maximumSubarrayXor(vector<int>& nums, vector<vector<int>>& queries) {const int N = nums.size();vector<vector<int>> f(N, vector<int>(N));for (int i = 0; i < N; i++) { f[i][i] = nums[i]; }auto vMax1 = f, vMax = f;for (int len = 2; len <= N; len++) {for (int i = 0; i + len <= N; i++) {const int end = i + len - 1;f[i][end] = f[i][end - 1] ^ f[i + 1][end];vMax1[i][end] = max(vMax1[i+1][end], f[i][end]);vMax[i][end] = max(vMax[i][end - 1], vMax1[i][end]);}}vector<int> ans;for (const auto& v : queries) {ans.emplace_back(vMax[v[0]][v[1]]);}return ans;}};

单元测试

vector<int> nums;vector<vector<int>> queries;TEST_METHOD(TestMethod11){nums = { 2,8,4,32,16,1 }, queries = { {0,2},{1,4},{0,5} };auto res = Solution().maximumSubarrayXor(nums, queries);AssertEx({ 12,60,60 }, res);}TEST_METHOD(TestMethod12){nums = { 0,7,3,2,8,5,1 }, queries = { {0,3},{1,5},{2,4},{2,6},{5,6} };auto res = Solution().maximumSubarrayXor(nums, queries);AssertEx({ 7,14,11,14,5 }, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
员工说:技术至上,老板不信;投资人的代表说:技术至上,老板会信。
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

HTML DOM 方法

HTML DOM 方法 引言 HTML DOM&#xff08;文档对象模型&#xff09;是HTML文档的编程接口&#xff0c;它允许开发者通过JavaScript来操作HTML文档中的元素。DOM 方法是DOM编程的核心&#xff0c;它提供了丰富的操作手段来改变网页的结构、样式和行为。本文将详细介绍HTML DOM中…

w嵌入式分享合集68

自己的原文哦~ https://blog.51cto.com/whaosoft/14133002 一、一键开关机电路的设计方案 方案一&#xff1a;电路图 一键开关机电路分析如下&#xff1a; 电路工作流程如下&#xff1a; Key按下瞬间&#xff0c;Q2、Q1导通&#xff0c;7805输入电压在8.9V左右&…

FFmpeg QoS 处理

FFmpeg 中的 QoS (服务质量) 处理主要关注于实时流媒体传输中的时序控制、丢帧策略和网络适应等方面。以下是 FFmpeg 中 QoS 相关的关键机制和配置方法。1. 基本 QoS 机制丢帧策略 (Frame Dropping)cAVDictionary *options NULL; av_dict_set(&options, "framedrop&q…

TexStudio中的Latex,PDFLatex,XeLatex和LuaLatex的区别

多种LaTeX编译器一、多种LaTeX编译器 1.1 PDFLaTeX&#xff08;1994年&#xff09; 默认、最常用的引擎。 输入文件通常是 ASCII 或 UTF-8 编码&#xff08;但中文需要 CJK 宏包或 ctex 宏包支持&#xff09;。 字体选择受限&#xff1a;只能使用 TeX 自带的字体或者 Type 1…

容器化部署:用Docker封装机器翻译模型与服务详解

文章目录一、机器翻译容器化的技术栈选型1.1 为什么需要容器化MT模型&#xff1f;1.2 基础镜像选择对比1.3 典型依赖分层方案1.4 性能对比&#xff08;容器化 vs 原生部署&#xff09;二、关键部署模式2.1 轻量级API服务封装2.2 模型热更新策略三、Docker镜像构建3.1 编写Docke…

leetcode_42 接雨水

1. 题意 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 2. 题解 这个题不会做&#xff0c;全部是看得题解捏。 不过能看懂题解感觉自己也很棒了&#xff01; 看完题解后感觉最难的是如何求出有多少…

Spring Boot 整合 Thymeleaf 模板引擎:从零开始的完整指南

引言&#xff1a;为什么选择 Thymeleaf&#xff1f; Thymeleaf 是一个现代化的服务器端 Java 模板引擎&#xff0c;专为 Web 开发而设计。与 JSP 不同&#xff0c;Thymeleaf 模板是纯 HTML 文件&#xff0c;可以直接在浏览器中预览&#xff0c;无需后端服务器支持。这种"…

pytest介绍(python测试框架)(@pytest.mark.parametrize、@pytest.fixtures)

文章目录**1. 核心特点**- **简洁易用**&#xff1a;无需复杂的配置&#xff0c;只需编写简单的函数或类即可进行测试。- **丰富的断言**&#xff1a;直接使用 Python 内置的 assert 语句&#xff0c;失败时提供详细的错误信息。- **自动发现测试**&#xff1a;通过约定的命名规…

[Python 基础课程]继承

在 Python 的面向对象编程&#xff08;OOP&#xff09;中&#xff0c;继承&#xff08;Inheritance&#xff09; 是一种重要的机制&#xff0c;它允许一个类&#xff08;称为子类或派生类&#xff09;从另一个类&#xff08;称为父类、基类或超类&#xff09;中继承属性和方法。…

QT之设计器组件功能(8大类55个组件)

组件名称 功能描述关键属性1. Layouts&#xff08;布局组件&#xff09;(1) Vertical Layout&#xff08;垂直布局&#xff09;将子控件按垂直方向依次排列layoutSpacing&#xff1a;控件之间的间距layoutMargin&#xff1a;布局边缘的边距layoutStretch&#xff1a;设置各控件…

java中list的api详细使用

在Java中&#xff0c;List是集合框架中最常用的接口之一&#xff0c;继承自Collection&#xff0c;代表有序、可重复的元素集合&#xff08;允许null元素&#xff09;。其核心实现类有ArrayList&#xff08;数组实现&#xff0c;随机访问高效&#xff09;、LinkedList&#xff…

Azure AI Search 探索总结

Azure AI Search 原名 Azure Cognitive Service&#xff0c;是Azure中用来给AI项目构建知识库的组件。知识库本质和数据库很像&#xff0c;但是内部的存储结构和检索算法不一样。比如并不是知识库的每一列都可以用来过滤、检索或group by&#xff0c;而是要根据实际情况配置。A…

高效解决 pip install 报错 SSLError: EOF occurred in violation of protocol

高效解决 pip install 报错 SSLError: EOF occurred in violation of protocol 标签&#xff1a; Python, pip, SSLError, Clash, 网络代理, 问题解决 一、问题描述 在Python开发中&#xff0c;pip 是我们最亲密的伙伴。然而&#xff0c;当你身处需要科学上网的环境&#xff0c…

CSS 核心知识点全解析:从基础到实战应用

大家好&#xff01;今天这篇文章将系统总结 CSS 的核心知识点&#xff0c;从最基础的样式引入到复杂的选择器应用&#xff0c;再到盒子模型、文本处理等实战技巧&#xff0c;全程结合代码示例&#xff0c;让你轻松掌握 CSS 的精髓。一、CSS 是什么&#xff1f;为什么需要它&…

ClickHouse的学习与了解

什么是ClickHouse&#xff1f; ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。 在传统的行式数据库系统中&#xff0c;数据按如下顺序存储&#xff1a;RowWatchIDJavaEnableTitleGoodEventEventTime#0893543506621Investor Relations12016/5/18 5:19#1903295…

安卓11 12系统修改定制化_____修改系统 解锁system分区 去除data加密 自由删减系统应用

在定制化系统中。修改系统分区 解锁system。让用户可以自由删减应用。这个在定制化服务中比较常见。对于此项修改服务。需要我们了解基础的分区常识以及常用的几种基础修改步骤。 通过博文了解💝💝💝 1💝💝💝-----修改rom 解锁 system 分区有什么意义 2💝💝…

JetPack系列教程(八):PDF库——让Android应用也能优雅“翻页”

JetPack系列教程&#xff08;八&#xff09;&#xff1a;PDF库——让Android应用也能优雅“翻页” 在Android开发的世界里&#xff0c;加载PDF文件一直是个让人又爱又恨的“小妖精”。爱它&#xff0c;因为PDF是文档界的“万能钥匙”&#xff1b;恨它&#xff0c;因为原生Andr…

Three.js三大组件:场景(Scene)、相机(Camera)、渲染器(Renderer)

上一篇中我们学习了第一个Three.js场景"Hello World"。这一篇就来学习three.js的核心组件。 此图来源&#xff08;Three.js中文网&#xff09; three.js的核心由三大组件构成&#xff1a;场景(Scene)、相机(Camera)和渲染器(Renderer)。下面我将详细介绍这三大件的作…

AI幻觉终结之后:GPT-5开启的“可靠性”新赛道与开发者生存指南

摘要&#xff1a; Sam Altman关于GPT-5将基本终结幻觉的宣告&#xff0c;不仅仅是一次技术升级&#xff0c;它标志着一个“万物皆可AI&#xff0c;但万事皆需验证”的混乱时代的结束。本文将从一个全新的战略视角出发&#xff0c;探讨当“可靠性”取代“创造性”成为AI竞赛的核…

ubuntu远程桌面很卡怎么解决?

服务端方案 完成XRDP的性能优化配置&#xff1a; 1. 首先检查当前的xrdp.ini文件 grep -n "tcp_send_buffer_bytes" /etc/xrdp/xrdp.ini2. 编辑xrdp.ini文件&#xff0c;修改TCP发送缓冲区大小 sudo sed -i s/#tcp_send_buffer_bytes32768/tcp_send_buffer_bytes4194…