my 9.15 T3
子串的好串
涉及到的几个点实在值得记录一下:
1. 状压+hash
2. 前缀次数统计
3. 强制添加字符+前缀,以反向求仅有一个字符的子串,前缀次数统计可以考虑完所有的子串情况
func main() {
var s string
fmt.Scanln(&s)
m := make(map[int]int)
cur := 0
ans := 0
m[0] = 1
for i := 0; i < len(s); i++ {
// 状压,所有奇数个字符的情况都压缩到了一个数中,作为前缀
cur ^= 1 << int(s[i]-'a')
// 强制添加一次每个字符(cur^(1<<i)),如果之前有过前缀,那么前缀的结尾到当前位置这个添加的字符数就是奇数,其他字符都是偶数
for i := 0; i < 26; i++ {
ans += m[cur^(1<<i)]
}
// 因为前缀之前可能出现过
m[cur] = m[cur] + 1
}
fmt.Println(ans)
} 
