标签:
所以对于这道题,求出len处的next值,并递归的向下求出所有的next值,得到的就是答案。
所以每次只需要找此段匹配的长度就好
代码:用了个递归,浪了一下,竟然还没PE;
1 #include<stdio.h> 2 #include<string.h> 3 const int MAXN=400010; 4 char s[MAXN]; 5 int p[MAXN],len; 6 void getp(){ 7 int i=0,j=-1; 8 p[0]=-1; 9 while(i<len){ 10 if(j==-1||s[i]==s[j]){ 11 i++;j++; 12 p[i]=j; 13 } 14 else j=p[j]; 15 } 16 } 17 void print(int x){ 18 if(x<=0)return; 19 print(p[x]); 20 printf("%d ",x); 21 } 22 int main(){int i,j; 23 while(~scanf("%s",s)){ 24 len=strlen(s); 25 getp(); 26 /*for(i=0;i<=len;i++)printf("%d ",p[i]);puts(""); 27 j=len; 28 while(j>=0){ 29 for(i=p[j];i<j;i++)printf("%c",s[i]);puts(""); 30 j=p[j]; 31 }*/ 32 print(len);puts(""); 33 } 34 return 0; 35 }
Seek the Name, Seek the Fame(Kmp)
标签:
原文地址:http://www.cnblogs.com/handsomecui/p/4711034.html