LibreOJ #10046

Posted KnightL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LibreOJ #10046相关的知识,希望对你有一定的参考价值。

Description

两个字符串 \\(A\\)\\(B\\),若 \\(A\\)\\(B\\) 的前缀且 \\(A\\ne B\\),则称 \\(A\\)\\(B\\) 的 proper 前缀。

两个字符串 \\(C\\)\\(D\\),若 \\(C\\)\\(D\\) 的 proper 前缀且 \\(D\\)\\(CC\\) 的前缀,则称 \\(C\\)\\(D\\) 的周期。

给出一个字符串,求它的所有前缀的最大周期长度之和。

Solution

这题有点构造那味了。

首先我们要明确,此周期非循环节,而是一个 proper 前缀,同时我们又需要他尽量长,所以我们可以只留下一个最短公共前后缀,剩下的都作为 proper 前缀。

这样一来,此 proper 前缀自己循环一遍后,自己留下的最短公共前后缀接到了自己的后边,恰好可以和原串匹配,所以可以保证循环一次以后照样可以匹配。

我们又知道 \\(\\text{nxt}[i]\\) 的性质可以找最长公共前后缀,所以处理出 \\(\\text{nxt}\\) 并不断向前递归即可找到最短公共前后缀。

以上是关于LibreOJ #10046的主要内容,如果未能解决你的问题,请参考以下文章

LibreOJ #526. 「LibreOJ β Round #4」子集

LibreOJ #525. 「LibreOJ β Round #4」多项式

LibreOJ #528. 「LibreOJ β Round #4」求和

LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力

LibreOJ #515. 「LibreOJ β Round #2」贪心只能过样例

LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿