异或和公式

前缀异或和公式

前缀异或和的概念与前缀和类似,但它使用的是异或(XOR)操作而不是加法。异或操作有一些独特的性质,使得前缀异或和在处理某些问题时非常有用。下面是前缀异或和的推导原理:

• 异或操作的性质:

85453e6091544af7b1203857613c5e1f.png

 

• 前缀异或和的定义:

对于一个数组nums,其前缀异或和数组prefixXor定义为:

9d94213a5eaf4bb7a5487774ae7956e4.png

其中,prefixXor[0]通常定义为0,作为基准。

• 计算前缀异或和:

• 初始化:prefixXor[0]=0

• 对于i从 1 到n(数组长度):

e0417300883e427b84d85a022042d887.png

这个递推公式的意思是,当前位置的前缀异或和等于前一个位置的前缀异或和与当前元素的异或。

• 推导过程:

• 假设我们已经有了prefixXor[i-1],它表示从数组开始到第i-1个元素的异或和。

• 要得到prefixXor[i],即到第i个元素的异或和,我们只需要将prefixXor[i-1]与第i个元素(nums[i-1]进行异或操作。

• 这是因为异或操作的结合律允许我们将异或操作分组,而不影响最终结果。

• 应用:

• 一旦我们有了前缀异或和数组,我们可以在O(1)时间内计算任意子区间的异或和。

• 对于子区间[l,r],其异或和可以通过

712b383f513040d19b401f815962b508.png

 计算得到。这里l和r分别是子区间的起始和结束索引。

子区间的异或和

子区间的异或和可以通过前缀异或和数组来快速计算。这里是一个逐步的推理过程,解释如何得到子区间异或和的公式:

• 前缀异或和数组:首先,我们定义一个前缀异或和数组prefixXor,其中prefixXor[i]表示从数组的开始到第i个元素的连续子数组的异或和。

• 子区间异或和的计算:假设我们想要计算从索引l到索引r(包括l和r)的子区间的异或和。我们可以利用前缀异或和数组来快速得到这个值。

• 利用异或的性质:异或操作有一个重要的性质,即A ^ A = 0和A ^ 0 = A。这意味着,如果我们想要从prefixXor[r]中移除从l-1到0的异或和,我们可以将prefixXor[l-1]异或到prefixXor[r]上。

• 子区间异或和的公式:因此,从l到r的子区间异或和可以通过以下公式计算:

61d5f806e2ed47569445c311038783d1.png

这里,prefixXor[r]包含了从数组开始到r的所有元素的异或和,而prefixXor[l-1]包含了从数组开始到l-1的所有元素的异或和。将这两个值异或,我们就得到了从l到r的子区间的异或和。

• 为什么这样工作:这个公式之所以有效,是因为异或操作的结合律和交换律。结合律允许我们重新组合异或操作,而交换律允许我们改变操作的顺序。通过将prefixXor[r]与prefixXor[l-1]异或,我们实际上是在计算从l到r的所有元素的异或和,同时消除了l-1之前的所有元素的影响。

• 应用:在实际编程中,这个公式允许我们在 O(1)时间内计算任意子区间的异或和,这是非常高效的。这对于解决需要频繁计算子区间异或和的问题非常有用。

通过这种方式,我们可以利用前缀异或和数组来快速计算数组中任意子区间的异或和,这是解决许多与异或和相关的问题的关键技术。

为什么使用异或:

• 异或操作在处理某些问题时非常有用,比如某某个问题中,我们需要找出所有子区间的异或和等于2^x的数量。使用前缀异或和可以快速地计算出任意子区间的异或和,从而解决问题。

代码

#include <iostream> 
#include <vector>   using namespace std;// 函数:计算前缀异或和
vector<int> prefixXor(const vector<int>& nums) {vector<int> prefixXor(nums.size() + 1, 0); // 初始化前缀异或和数组,长度为nums.size() + 1,初始值为0for (int i = 1; i <= nums.size(); ++i) { // 从1开始遍历到nums.size(),计算前缀异或和prefixXor[i] = prefixXor[i - 1] ^ nums[i - 1]; // 当前位置的前缀异或和等于前一个位置的前缀异或和与当前元素的异或}return prefixXor; // 返回计算好的前缀异或和数组
}// 函数:计算异或和为2^x的子区间数量
int countSubarraysWithXor(vector<int>& prefixXor, int n, int x) {int count = 0; // 初始化计数器,用于统计符合条件的子区间数量int length = 1 << x; // 计算子区间的长度,即2^xfor (int start = 0; start <= n - length; ++start) { // 遍历所有可能的子区间起始位置int xorValue = prefixXor[start + length] ^ prefixXor[start]; // 计算子区间的异或和if (xorValue == (1 << x)) { // 如果子区间的异或和等于2^xcount++; // 增加计数器}}return count; // 返回符合条件的子区间数量
}int main() {int n; // 定义数组长度变量cin >> n; // 从标准输入读取数组长度vector<int> nums(n); // 创建一个向量来存储数组元素for (int i = 0; i < n; ++i) { // 遍历数组,从标准输入读取每个元素cin >> nums[i];}vector<int> prefixXor = prefixXor(nums); // 调用函数计算前缀异或和for (int x = 0; x <= 18; ++x) { // 遍历所有可能的x值,即2^xcout << countSubarraysWithXor(prefixXor, n, x) << endl; // 调用函数计算并输出每个x对应的子区间数量}return 0;
}

注意

左移运算符(  <<  ),它是一种快速计算乘以2的幂的方法。1 << x 等同于计算 2 的 x 次幂,即 2^x 。

 

 

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

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

相关文章

【Unity】 HTFramework框架(五十三)使用 Addressables 可寻址系统

更新日期&#xff1a;2024年7月25日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 Addressables 可寻址系统使用 Addressables 可寻址系统一、导入 Addressables二、切换到 Addressables 加载模式三、切换资源加载助手四、加载资源五、注…

Spring Cache简单使用

Spring Cache是一个框架&#xff0c;实现了基于注解的缓存功能。只需要简单地加一个注解&#xff0c;就能实现缓存功能 Spring Cache提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff0c;例如&#xff1a; 1.EHCahce 2.Chffeine 3.Redis 需要导入的maven坐标 …

Delphi Web前端开发教程(9):基于TMS WEB Core框架

3、REST Servers服务端(后端)框架 REST服务端特点&#xff1a; – 为远程资源提供一个REST API接口。也可以为其他网络内容提供服务&#xff1b; – 包括在Delphi Enterprise & Architect企业版和架构师版中的RAD服务器、DataSnap、WebBroker&#xff1b; – 开源框架&a…

vue+mars3d点击图层展示炫酷的popup弹窗

展示效果 目录 一&#xff1a;叠加数据图层到地图上&#xff0c;此时需要使用bindPopup绑定popup 二、封装自定义的popup&#xff0c;样式可以自行调整 一&#xff1a;叠加数据图层到地图上&#xff0c;此时需要使用bindPopup绑定popup 这里我根据数据不同&#xff0c;展示的…

【机器人学】3-1.六自由度机器人速度域-雅克比矩阵【附MATLAB代码】

MATLAB仿真验证 已知六轴机器人的D-H参数如下所示&#xff1a; 关节1关节2关节3关节4关节5关节609000-9090a0042539300d160.700113.39993.60900-9000000000 通过D-H参数&#xff0c;选用改进型的D-H参数&#xff0c;可以得到各个关节间的旋转矩阵。详细请看我的第一篇博客六自…

基于SSM的网上拍卖系统+LW示例参考

1.项目介绍 系统角色&#xff1a;管理员、卖家、买家功能模块&#xff1a;用户管理、卖家管理、公告管理、竞拍物品管理、预约竞拍管理、竞拍管理等技术选型&#xff1a;SSM&#xff0c;jsp等测试环境&#xff1a;idea2024&#xff0c;jdk1.8&#xff0c;tomcat8&#xff0c;n…

Vue3安装 运行教程

本文是综合了所有vue安装教程而成 更细化 更简略 希望对各位读者有所帮助&#xff01; Vue安装 1. Vue-cli脚手架安装 安装vue的方式有很多 我们这里选择npm方式安装vue npm方式 npm方式安装vue&#xff0c;详细介绍见下文。 1.node.js安装和配置 安装npm 需要安装note.js&…

帝可得-设备管理

设备管理 需求说明 点位管理主要涉及到三个功能模块&#xff0c;业务流程如下&#xff1a; 新增设备类型: 允许管理员定义新的售货机型号&#xff0c;包括其规格和容量。新增设备: 在新的设备类型定义后&#xff0c;系统应允许添加新的售货机实例&#xff0c;并将它们分配到特…

w070基于springboot的大创管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0…

FlyHttp 的最佳实践:加速项目级 API 请求构建

FlyHttp的相关文章&#xff1a; FlyHttp 的诞生&#xff1a;从认识各种网络请求开始 FlyHttp 的设计思想&#xff1a;前端 API 自动化构建工具 FlyHttp 的使用&#xff1a;如何高效使用 FlyHttp&#xff0c;支持 JS、TS 项目 一. FlyHttp 是什么&#xff1f; 这是一个自动…

七次课掌握 Photoshop:样式与滤镜

Photoshop 中的图层样式和滤镜功能&#xff0c;能够为图像添加丰富的效果和质感&#xff0c;使图像更加生动和富有创意。熟练掌握这些工具和方法&#xff0c;可以大大提升作品的视觉表现力。 一、图层样式 图层样式 Layer Styles是应用于图层或图层组的特效&#xff0c;如投影、…

ML23_变分推理Variational inference

可以先看第一期https://blog.csdn.net/qq_51605551/article/details/141901941 变分推理&#xff08;Variational Inference, VI&#xff09;是一种用于近似贝叶斯推断的方法&#xff0c;它在处理复杂的概率模型时特别有用。贝叶斯推断的核心是计算后验分布&#xff0c;即在给…

Map和Set(下)

我们先对上一小节部分进行一些复习和补充 1. 补充和强调 补充 1. HashMap 和 HashSet 即 java 中利用哈希表实现的 Map 和 Set 2. java 中使用的是哈希桶方式解决冲突的 3. java 会在冲突链表长度大于一定阈值后&#xff0c;将链表转变为搜索树&#xff08;红黑树&#xff09;条…

StackWalker 遍历栈帧

StackWalker 遍历栈帧 背景StackWalkerStackFrameOption方法创建 StackWalkerwalk例&#xff1a;打印所有信息例&#xff1a;打印反射帧、隐藏帧 forEachgetCallerClass例&#xff1a;直接调用、反射调用例&#xff1a;栈底调用会抛异常 参考 背景 在看 springboot 3.x 源码时…

捷联惯导原理和算法预备知识

原理和算法预备知识 牛顿第一运动定律-惯性定律&#xff1a;如一物体不受外力作用&#xff0c;它将保持静止状态或匀速直线运动状态不变。 牛顿第二运动定律&#xff1a;表达式为Fma,。其中F为物体所受的合力&#xff0c;m为物体的质量&#xff0c;a为物体的加速度。这个公式…

便捷工具--ssh登录ubuntu

一、概述 由于ubuntu终端的使用会有诸多不便捷的地方&#xff0c;建议使用mobaterm、xshell、SecureCRT等软件&#xff0c;通过ssh方式&#xff0c;操作虚拟机的ubuntu系统。 1、ssh的安装 sudo apt install openssh-server2、查看ubuntu的ip 3、ssh端登录 ssh链接linux端的…

【白盒测试】单元测试的理论基础及用例设计技术(6种)详解

目录 &#x1f31e;前言 &#x1f3de;️1. 单元测试的理论基础 &#x1f30a;1.1 单元测试是什么 &#x1f30a;1.2 单元测试的好处 &#x1f30a;1.3 单元测试的要求 &#x1f30a;1.4 测试框架-Junit4的介绍 &#x1f30a;1.5 单元测试为什么要mock &#x1f3de;️…

【案例分享】高性能AI边缘计算赋能车端真值系统​

近年来&#xff0c;智能驾驶行业正在蓬勃发展&#xff0c;对于研发完成的智能驾驶车辆&#xff0c;需要对其进行全方面的测试才能商用量产&#xff0c;以确保用户的人身财产安全。将测试车辆直接进行实际道路测试将面临安全性&#xff0c;经济性&#xff0c;场地可靠性&#xf…

【docker】11. 容器实战案例

综合实战一&#xff1a;Mysql 容器化安装 进入 mysql 的镜像网站&#xff0c;查找 mysql 的镜像 mysql docker hub 官网 可以看到有这么多的 tag 我们选择使用最多的 5.7 版本&#xff0c;拉取镜像 root139-159-150-152:/data/myworkdir/container# docker pull mysql:5.7 5.…

全新图文对、视频文本对数据集,高效赋能多模态大模型训练任务

海天瑞声11月数据集上新&#xff01;这次推出的数据集包括语音识别、语音合成、多模态等领域&#xff0c;可用于多模态大模型训练任务&#xff0c;开发者可轻松应对数据瓶颈&#xff0c;高效提升模型性能。 印度尼西亚语语音识别数据集 泰语语音识别数据集 温柔贴心中文女声语…