一、问题分析
这道题目要求我们统计数组中所有"美丽"子数组的数量。美丽子数组的定义是:通过特定的二进制位操作可以将子数组中的所有元素变为0。关键在于理解这些操作的本质:
每次操作选择两个数,在它们的相同二进制位都为1时,可以同时减去该位的值
这种操作实际上相当于对两个数进行异或操作
因此,美丽子数组的条件等价于子数组中所有元素的异或结果为0
二、解题思路
我们可以使用异或前缀和与哈希表来高效解决这个问题:
计算前缀异或和数组
使用哈希表统计每个异或值出现的次数
当相同的异或值再次出现时,说明这两个位置之间的子数组异或和为0
累加所有满足条件的子数组数量
class Solution {
public:
long long beautifulSubarrays(vector<int>& nums) {
unordered_map<int, int> prefix_xor_counts;
prefix_xor_counts[0] = 1; // 初始前缀异或和为0出现1次
int current_xor = 0;
long long result = 0;
for (int num : nums) {
current_xor ^= num; // 计算当前前缀异或和
// 如果之前出现过相同的异或值,说明中间子数组异或和为0
result += prefix_xor_counts[current_xor];
// 更新当前异或值的出现次数
prefix_xor_counts[current_xor]++;
}
return result;
}
};