https://leetcode-cn.com/problems/count-triplets-that-can-form-two-arrays-of-equal-xor/
Given an array of integers arr.
We want to select three indices i, j and k where (0 <= i < j <= k < arr.length).
Let’s define a and b as follows:
a = arr[i] ^ arr[i + 1] ^ … ^ arr[j - 1]
b = arr[j] ^ arr[j + 1] ^ … ^ arr[k]
Note that ^ denotes the bitwise-xor operation.
Return the number of triplets (i, j and k) Where a == b.
又是一道异或题
异或的符号老是有点记不住
本期重要知识点应该是
a^b = c => 两边同时异或b
a = b ^ c
这题秀的地方在于,当i k满足条件时,任意的j都满足
这点乍一想感觉还挺奇葩的
实则很有道理
func countTriplets(arr []int) int {
n := len(arr)
s := make([]int, n + 1)
for i, val := range arr {
s[i + 1] = s[i] ^ val
}
ans := 0
for i := 0; i < n; i++ {
for k := i + 1; k < n; k++ {
if s[i] == s[k + 1] {
ans += k - i
}
}
}
return ans
}
随便贴一个go的二次循环解法
这题能用空间优化到一次遍历确实有点nb
小知识:
- go
m, has := cnt[s]
这样写时,m== cnt[s] has==map cnt中是否存在s
if m, has := cnt[s^val]; has {
ans += m*k - total[s^val]
}
if (cnt.count(s ^ val)) {
ans += cnt[s ^ val] * k - total[s ^ val];
}
上面两个block是go和cpp中的写法
2.cnt, total = Counter(), Counter()
python3中有这种奇葩东西,可以当map用
- py3 海象运算符
大概就是赋值语句 同时表达式的结果为赋值结果
秀的我头晕
以后不看go了,先练python吧,三语写起来太吃力了