LeetCode 1442 - 形成两个异或相等数组的三元组数目
题目链接:LeetCode 1442 - 形成两个异或相等数组的三元组数目
记 \(S_i\) 为 \(x_0\) 到 \(x_i\) 的 \(\rm xor\) 和。
如果 \(S_i = S_j\),那么说明 \([i - 1, j]\) 区间的 \(\rm xor\) 和为 \(0\),这个区间对答案的贡献为 \(j - i - 1\)。
假设 \(S\) 序列中值为 \(t\) 的数字的位置组成了序列 \(p_0, p_2, p_3, ..., p_{n - 1}\)
那么 \(t\) 对应的这个序列对答案的贡献是:
\[ \begin{aligned} & \sum_{i = 0}^{n - 1} \sum_{j = 0}^{i - 1} p_i - p_j - 1 \\ = & \sum_{i = 0}^{n - 1} \left[ \sum_{j = 0}^{i - 1} p_i - \sum_{j = 0}^{i - 1} p_j - \sum_{j = 0}^{i - 1} 1 \right] \\ = & \sum_{i = 0}^{n - 1} \left[ i \times p_i - \sum_{j = 0}^{i - 1} p_j - i \right] \end{aligned} \]
其中 \(\sum_{j = 0}^{i - 1} p_j\) 可以在线性的时间内预处理出来,或者对 \(i\) 枚举的时候直接算。
于是上面这个算式就可以在线性时间内算出来。
对每个 \(t\),都算这个式子。
时间 / 空间都是 \(O(n)\)。
1 | class Solution { |