故从len=>next[len]=>next[next[len]] ....=>直到某个next[]为0均为合法答案 。
AC代码:
#include<stdio.h> #include<string.h> #define max 400005 char s[max]; int next[max]; int len; int a[max]; void get_next() { int i=0; int j=-1; next[0]=-1; while(i<len) { if(j==-1||s[i]==s[j]) { i++; j++; next[i]=j; } else { j=next[j]; } } } int main() { while(scanf("%s",s)!=EOF) { int i,j; memset(next,0,sizeof(next)); len=strlen(s); get_next(); j=next[len]; int cnt=0; while(j>0) { a[cnt++]=j; j=next[j]; } for(i=cnt-1;i>=0;i--) { printf("%d ",a[i]); } printf("%d\n",len); } return 0; }这里有两个博客写KMP的理解,很好: