2 条题解
-
3
XOR
建立 Trie。
建立前缀 Trie ,后缀 Trie。
枚举 , 前缀包含 ,后缀就是 。
前缀 Trie 和后缀 Trie 建立起来,分别记作 : 。不难发现答案即为: 同一个前缀 ,令其在 中的结尾下标为 ,答案即为 $\sum\limits_{x}{sz_{1, son_{p_1, bit} \times sz_{2, son_{p_2, bit \oplus 1}}}}$。 是去除与前缀 相同长度的前缀后,他的位。
相当于同一个前缀 ,令这个前缀相同,随后到这一位恰好左边小,右边大。
随后,不难发现这是可以 BF 平方的。
// 此处 0 是根,调用: dfs1(29, 0, 0, a[i]) ; void dfs1(int dep,int p, int q, int x) { if(dep != 29 && (p == 0 || q == 0)) return ; int bit = (x >> dep) & 1 ; ans += v1[t1[p][bit]] * 1ll * v2[t2[p][!bit]] ; if(dep < 0) return ; dfs1(dep-1, t1[p][0], t2[q][0], x) ; dfs1(dep-1, t1[p][1], t2[q][1], x) ; }然而,这需要优化。不难发现这可以记录 表示深度为 , 的和。
就是固定了深度和位权,维护总和。不难发现,由于修改次数是对数的,复杂度正确。
Trie 树以后以 为根。
信息
- ID
- 2798
- 时间
- 3000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 13
- 已通过
- 5
- 上传者