设 x 出现了 \textit{cnt}[x] 次。为了让不同数对尽可能地多,应当把 \left\lfloor\dfrac{\textit{cnt}[x]}{2}\right\rfloor 个 x 异或 2^k-1,其余的 \left\lceil\dfrac{\textit{cnt}[x]}{2}\right\rceil 个 x 保持不变。
package main
import("bufio";."fmt";"os")
func main() {
in := bufio.NewReader(os.Stdin)
var n, k, v, s int
Fscan(in, &n, &k)
ans := c2(n + 1)
m := 1<<k - 1
cnt := map[int]int{s: 1} // s[0]
for ; n > 0; n-- {
Fscan(in, &v)
s ^= v
cnt[min(s, s^m)]++
}
for _, c := range cnt {
ans -= c2(c/2) + c2(c-c/2)
}
Print(ans)
}
func c2(n int) int64 { return int64(n) * int64(n-1) / 2 }
func min(a, b int) int { if a > b { return b }; return a }