题目大意:小猫是非常有名气的,所以很多父母都来找它给孩子取名字,因为找的人比较多,小猫为了摆脱这个无聊的工作,于是它发明了一种取名字的办法,它把孩子父母的名字合在一起,然后从这个名字里面找一个前缀,并且这个前缀也得是后缀,然后用它当孩子的名字,比如父亲的名字是:ala,母亲的名字是la, 那么孩子的名字就可以是“a”,“ala”,“alala”, 现在想知道孩子的名字可以多长?
分析:最长的那个一定是字符串的长度,第二长的就是前缀后缀的最大匹配度 next[N],第三长的就是next[next[N]],一直递归下去,直到等于0。
下面是AC代码
=========================================================================================
#include<stdio.h>
#include<string.h> const int MAXN = 1e6+;
const int oo = 1e9+; char s[MAXN];
int next[MAXN], ans[MAXN]; void GetNext(int N)
{
int i=, j=-;
next[] = -; while(i < N)
{
if(j==- || s[i]==s[j])
next[++i] = ++j;
else
j = next[j];
}
} int main()
{ while(scanf("%s", s) != EOF)
{
int N = strlen(s), k=; GetNext(N); ans[k++] = N; while(next[N] != )
{
ans[k++] = next[N];
N = next[N];
} for(int i=k-; i>=; i--)
{
printf("%d%c", ans[i], i ?' ':'\n');
}
} return ;
}