题意:给定一个串,求其所有的同为前缀和后缀的子串的长度。
思路:用KMP预处理的next数组就可以解决,时间为O(n)。可以这样想,符合题意的最长的串必为原串,次长度为next[len-1],这是由next数组的定义决定的。再次长度就是对str[0,next[len-1]]这个串去求,也就是next[next[len-1]]这么长。所以递归求下去就可以了。
#include <cstdio>
#include <cstring>
#define N 400005
char s[N];
int next[N],len;
void getnext(){
int i,k;
next[0] = k = -1;
for(i = 1;i<len;i++){
while(k>-1 && s[k+1]!=s[i])
k = next[k];
if(s[k+1] == s[i])
k++;
next[i] = k;
}
}
void print(int x){
if(x!=-1){
print(next[x]);
printf("%d ",x+1);
}
}
int main(){
while(scanf("%s",s) != EOF){
len = (int)strlen(s);
getnext();
print(len-1);
putchar('\n');
}
return 0;
}