首先定义一个概念:
字符串:不定义了。
前缀pre(i):S[1...i]。后缀记为suf(i):S[i...1]。
子串:略。
Border:如果在字符串S中,存在一个前缀等于它的后缀,就称这个前缀是这个字符串的一个Border。
(PS:不允许选择整个串)
显然一个字符串可能有若干个Border。
记一个字符串中的最长的Border为LBorder。
特别的,我们把S的一个前缀的LBorder记为LBorder(i)
考虑怎么计算每个前缀的LBorder。
首先,LBorder(1)=0。这是废话。
然后假设我们已经把1~(i-1)的LBorder算出来了。
考虑现在计算LBorder(i),假设第i个字符是c。
然后考虑,如果LBorder(i)>0,那么把字符c去掉后,一定是i-1的一个Border。
因此我们可以枚举i-1的所有Border,找到其中最长的一个满足其后面的字符为c的Border。
如何找到i-1的所有Border呢?
我们注意到,串S的Border,要么是LBorder,要么是LBorder的一个Border。
因此每次令j=Border(j)就可以枚举到所有的Border。