type
status
date
slug
summary
tags
category
icon
password
创建时间
Jan 24, 2025 04:28 AM
给你一个整数数组
arr 。现需要从数组中取三个下标
i、j 和 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 成立的三元组 (i, j , k) 的数目。位运算——异或
推导
根据题意,有
a = arr[i] ^ arr[i + 1] ^ ... ^ arr[j - 1] 、b = arr[j] ^ arr[j + 1] ^ ... ^ arr[k] ,而题目让我们计算请够满足 a == b 成立的三元组 (i, j , k) 的数目。也就是 arr[i] ^ arr[i + 1] ^ ... ^ arr[j - 1]=== arr[j] ^ arr[j + 1] ^ ... ^ arr[k]]为了快速求任意区间的异或和,我们一般采用异或前缀和的形式。异或和的形式是
因此,、,则 。
三次循环
两次循环
我们通过推导,得到 ,发现与 无关。也就是只要 ,中间的所有 都满足,对应的个数是 。
一次循环——哈希表
参考力扣官方题解
对于下标 ,若下标 都满足 ,则有
因此,借助两个哈希表来做到,在遍历下标 的同时,一个哈希表统计 的出现次数,另一个哈希表统计值为 的下标之和。
过程中计算前缀和