🗒️1442. 形成两个异或相等数组的三元组数目
2025-1-24
| 2025-1-27
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
创建时间
Jan 24, 2025 04:28 AM
给你一个整数数组 arr 。
现需要从数组中取三个下标 ij 和 k ,其中 (0 <= i < j <= k < arr.length) 。
a 和 b 定义如下:
  • a = arr[i] ^ arr[i + 1] ^ ... ^ arr[j - 1]
  • b = arr[j] ^ arr[j + 1] ^ ... ^ arr[k]
注意:^ 表示 按位异或 操作。
请返回能够令 a == b 成立的三元组 (ij , k) 的数目。

位运算——异或

推导

根据题意,有 a = arr[i] ^ arr[i + 1] ^ ... ^ arr[j - 1]b = arr[j] ^ arr[j + 1] ^ ... ^ arr[k] ,而题目让我们计算请够满足 a == b 成立的三元组 (ij , k) 的数目。也就是 arr[i] ^ arr[i + 1] ^ ... ^ arr[j - 1]=== arr[j] ^ arr[j + 1] ^ ... ^ arr[k]]
为了快速求任意区间的异或和,我们一般采用异或前缀和的形式。异或和的形式是
因此,,则

三次循环

两次循环

我们通过推导,得到 ,发现与 无关。也就是只要 ,中间的所有 都满足,对应的个数是 

一次循环——哈希表

对于下标 ,若下标 都满足 ,则有
因此,借助两个哈希表来做到,在遍历下标 的同时,一个哈希表统计 的出现次数,另一个哈希表统计值为 的下标之和。
过程中计算前缀和

📎 参考

  • 【题单】位运算
  • Important
  • 2429. 最小异或2997. 使数组异或和等于 K 的最少操作次数
    Loading...