#include<stdio.h> #include<string.h> #define S 10000 #define T 100 int next[T]={0}; void get_next(char t[],int next[]) { int i=0,j=-1; while(t[i+1]!='\0') { if(j==-1||t[i]==t[j]) { ++i;++j; next[i]=j+1; } else j=next[j]-1; } } void get_nextval(char t[],int next[]) { int i=0,j=-1; while(t[i+1]!='\0') { if(j==-1||t[i]==t[j]) { ++i;++j; if(t[i]!=t[j]) next[i]=j+1; else next[i]=next[j]; } else j=next[j]-1; } } int kmp(char s[],char t[],int pos) { int i=pos-1,j=0,a=strlen(s),b=strlen(t); while(i<=a-1&&j<=b-1) { if(j==-1||s[i]==t[j]) {++i;++j;} else j=next[j]-1; } if(j==b) return i-j+1; else return 0; } int main() { int i,l; char s[S],t[T]; gets(t); get_next(t,next); //get_nextval(t,next); l=strlen(t); for(i=0;i<=l-1;i++) printf("%d ",next[i]); printf("\n"); return 0; } /************************************************************** Problem: 2151 User: admin Language: C Result: Accepted Time:11 ms Memory:1036 kb ****************************************************************/