标签:
如左图,假设黑色线来代表字符串str,其长度是len,红色线的长度代表next[len],根据next数组定义易得前缀的next[len]长度的子串和后缀next[len]长度的子串完全相同(也就是两条线所对应的位置)。我们再求出next[len]位置处的next值,也就是图中蓝线对应的长度。同样可以得到两个蓝线对应的子串肯定完全相同,又由于第二段蓝线属于左侧红线的后缀,所以又能得到它肯定也是整个字符串的后缀。所以对于这道题,求出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