P9364 字符串 STL
P9364 [ICPC2022 Xi'an R] Perfect Word
膜拜 Wei 神。
对于字符串 \(t\),定义 \(t\) 为 perfect word 仅当 \(t\) 的所有非空连续子串都出现在给定的字符串集 \(S\) 中。形式化地,\(t\) 为 perfect word 仅当
\[\bigwedge_{i \in \text{substr}(t)} i \in S \]其中 \(\text{substr}(t)\) 代表 \(t\) 的所有非空连续子串的集合。
首先可以想到类似递推的思路。
对于 perfect word \(t\),设 \(k \gets |t|\),很明显 \(t_1 \sim t_{k - 1}\) 和 \(t_2 \sim t_k\) 两个字符串囊括了所有 \(t\) 的子串。即,若 \(t_1 \sim t_{k - 1}\) 和 \(t_2 \sim t_k\) 都是 perfect word,则 \(t\) 亦是。
我们将 \(S\) 以长度递增作为关键字排序,这样如果 \(t_1 \sim t_{k - 1}, t_2 \sim t_k\) 为 perfect word ,就一定可以在 \(t\) 之前进行判断。特别地,对于 \(k = 1\),直接记录即可。
维护查找除了 trie 的单次 \(O(k)\),还可以使用更方便的 unordered_map。
时间复杂度主要体现于 sort 的 \(O(n \log n)\)。代码。

浙公网安备 33010602011771号