Loading

【题解】CF590E Birthday

考虑如果串 \(i\) 包含了串 \(j\),就连边 \(i\rightarrow j\),此时题目要求的是找到尽可能多的点,满足两两不可以到达。

这里构造最长反链即可,复杂度 \(O(n^3)\) 。现在考虑建图,注意到按照上述方法建的图就满足要求了,不必做传递闭包后再构造最长反链,但同时也没有很好的建图方法。

对于每个串的每个后缀,建 aho-corasick automaton 后只需要跳 fail 就能找到所有前缀,不妨考虑找到最长的那个前缀,然后最后做传递闭包建出原图。找最长的前缀就很简单了,可以线性解决。

时间复杂度 \(O(m+n^3)\)

代码:Submission #127779343 - Codeforces

posted @ 2021-09-03 23:43  Qiuly  阅读(86)  评论(0编辑  收藏  举报