microhhh的字符串综合训练3

时间限制: 3 ms 内存限制: 12500 kb
总通过人数: 1 总提交人数: 1

题目描述

jh1jx突发奇想不想用jhljx这个名字了,于是他让btyald给他换一个名字,btyald觉得想名字这件事太复杂,不想太伤脑筋, 所以就给jh1jx一个字符串,让他从这个字符串中找出既是前缀又是后缀的子串,再从这些子串中自己找一个合适的作为新 的名字,jh1jx想让你给他出个主意,让你帮他解决这个难题。要求你帮他在给定字符串中找出既是前缀又是后缀的子串, 求出这些子串的长度,最后他自己再来找个合适的。

输入

输入多组数据。 每组数据只有一行,为一个字符串(字符串长度为k,保证1<=k<=40000)。

输出

对于每组数据,从小到大输出符合要求子串(既是前缀又是后缀)长度。

输入样例

ababcababababcabab
aaaaa

输出样例

2 4 9 18
1 2 3 4 5

Hint

合理利用next数组,先自己想,不要看下面的做法

做法

此题非常简单,借用KMP算法的next数组,设s的长度为n,则s串本身必定满足条件。其他满足条件的子串都有个特征,就是该子串的最后一个字符肯定与s的最后一个字符相同。这正是next数组发挥作用的时候。从n - 1位既最后一位开始回滚,若s[next[n-1]] == s[n-1],则子串s[0,1,2,...,next[n-1]]是满足条件的子串。然后判断s[next[next[n-1]]] == s[n-1]是否成立,这样一直回滚,直到next[next[.....next[n-1]]] == -1为止。把答案从大到小存下来,再从小到大输出即可。

相关推荐