UVA11488 字符串 Trie

UVA11488 Hyper Prefix Sets

给定 01 串 \(S_1 \sim S_n\),选出一个 \(S\) 的子集 \(T\)。设 \(T\) 的长度为 \(k\),最大化 \(f(T) = |\operatorname{lcp}\{T\}| \times k\) 的值。

\(\operatorname{lcp}\) 意味着 Trie。考虑建字面意义上的 01-Trie。

对于 Trie 的每一个节点,维护节点深度 \(d\) 和子树字符串数量 \(l\)

由于 Trie 上 \(z_{\operatorname{lca}(u, v)} = \operatorname{lcp}( z_u, z_v)\),其中 \(z_u\) 是根节点到 \(u\) 的一条链所代表的字符串,所以 \(T\) 为节点 \(i\) 的子树字符串集时,\(f(T) = d_i \times l_i\)

枚举节点,求 \(\max d_i \times l_i\) 即可。代码


注意在多测清 Trie 时需注意以下几点:

  • 一定要清掉 \(tr_{i, 0}, tr_{i, 1}, d_i, l_i ~ (0 \leq i \leq cnt)\),注意要从 \(i = 0\) 开始;
  • \(cnt \gets 0\)

其中 \(cnt\) 为 Trie 的最大节点编号。

实际上没有必要开 int64

posted @ 2024-03-22 17:30  Carrot-Meow~  阅读(18)  评论(0)    收藏  举报