当前位置: 首页 > news >正文

【前缀异或和】力扣2588. 统计美丽子数组数目

给你一个下标从 0 开始的整数数组nums 。每次操作中,你可以:

选择两个满足 0 <= i, j < nums.length 的不同下标 i 和 j 。
选择一个非负整数 k ,满足 nums[i] 和 nums[j] 在二进制下的第 k 位(下标编号从 0 开始)是 1 。
将 nums[i] 和 nums[j] 都减去 2k 。
如果一个子数组内执行上述操作若干次后,该子数组可以变成一个全为 0 的数组,那么我们称它是一个 美丽 的子数组。

请你返回数组 nums 中 美丽子数组 的数目。

子数组是一个数组中一段连续 非空 的元素序列。

示例 1:
输入:nums = [4,3,1,2,4]
输出:2
解释:nums 中有 2 个美丽子数组:[4,3,1,2,4] 和 [4,3,1,2,4] 。

  • 按照下述步骤,我们可以将子数组 [3,1,2] 中所有元素变成 0 :
    • 选择 [3, 1, 2] 和 k = 1 。将 2 个数字都减去 21 ,子数组变成 [1, 1, 0] 。
    • 选择 [1, 1, 0] 和 k = 0 。将 2 个数字都减去 20 ,子数组变成 [0, 0, 0] 。
  • 按照下述步骤,我们可以将子数组 [4,3,1,2,4] 中所有元素变成 0 :
    • 选择 [4, 3, 1, 2, 4] 和 k = 2 。将 2 个数字都减去 22 ,子数组变成 [0, 3, 1, 2, 0] 。
    • 选择 [0, 3, 1, 2, 0] 和 k = 0 。将 2 个数字都减去 20 ,子数组变成 [0, 2, 0, 2, 0] 。
    • 选择 [0, 2, 0, 2, 0] 和 k = 1 。将 2 个数字都减去 21 ,子数组变成 [0, 0, 0, 0, 0] 。

示例 2:
输入:nums = [1,10,4]
输出:0
解释:nums 中没有任何美丽子数组。

在这里插入图片描述

class Solution {
public:long long beautifulSubarrays(vector<int>& nums) {long long ans = 0;int s = 0;unordered_map<int,int> group = {{0,1}};for(int x : nums){s ^= x;ans += group[s];group[s]++;}return ans;}
};

这道题考虑到有2的幂次方,应该想到使用位运算的方法来做。由于是对子段的每两个数减去2^k,所以说明将该子段的元素都转换为二进制以后,每次减去2 ^k说明在相同位置的比特位上都减去1,也就是说,经过数次这样的操作后,最后所有元素都为0后,就是美丽的子数组。这就要求这个子段里的二进制中,一共要有偶数个1,进而转换为这个子段的异或和为0,说明是美丽的子数组。

第二个点是前缀异或和这个知识,比如 (1 ^ 2 ^ 3 ^ 4) ^ (1 ^ 2) = 3^4, 这就说明要求 3 和 4这个子段的异或和,就可以用较长的异或和去 异或 一个较短的异或和。

初始化unordered_map<int,int> group = {{0,1}};,然后遍历数组nums,用s来记录前缀异或和,group来记录前缀异或和出现过的次数,ans用来记录美丽前缀异或的数量。等于说不断枚举s,来看s之前有多少个前缀异或和 和s一样的数目(也就是美丽子数组的数目)。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【脚本说明撰写markdown】如何基于VScode 撰写使用说明文档,及格式转换.md、.html、.pdf格式
  • LVS--DR模式
  • 游戏盾是什么,如何保护网络游戏的安全
  • 大模型日报 2024-08-07
  • 用录制好的视频文件模拟PC电脑摄像头进行无人值守直播/抖音直播/视频号直播/快手直播
  • 将本地微服务发布到docker镜像二:
  • Linux下安装Go语言环境的详细指南
  • 给本地设备搭建一个云端语音助手
  • Rider中修改默认文件关联,自定义打开方式
  • opencascade TopoDS_Builder 源码学习
  • Apache Doris + Iceberg 快速搭建指南|Lakehouse 使用手册(三)
  • Openwrt常用说明
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • 【Linux】:环境变量
  • 收银机打印机相关知识 windows7 查看打印机名称--未来之窗智慧经营收银系统百科
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【comparator, comparable】小总结
  • css系列之关于字体的事
  • extract-text-webpack-plugin用法
  • Git初体验
  • JavaScript 奇技淫巧
  • JS笔记四:作用域、变量(函数)提升
  • Js基础知识(一) - 变量
  • Linux后台研发超实用命令总结
  • ng6--错误信息小结(持续更新)
  • nodejs:开发并发布一个nodejs包
  • Solarized Scheme
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • 给Prometheus造假数据的方法
  • 今年的LC3大会没了?
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 云大使推广中的常见热门问题
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 积累各种好的链接
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • #nginx配置案例
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (007)XHTML文档之标题——h1~h6
  • (13)Hive调优——动态分区导致的小文件问题
  • (2022 CVPR) Unbiased Teacher v2
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (NSDate) 时间 (time )比较
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (WSI分类)WSI分类文献小综述 2024
  • (笔试题)分解质因式
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (力扣)循环队列的实现与详解(C语言)