扩展kmp
刘雅琼写的论文讲得挺好的,你们先学习下,然后再来看代码就比较简单了!!
#include<stdio.h> #include<string.h> int next[1000],extend[1000]; char S[1000],T[1000]; void get_next() { int a,p,k,j,len; int L; len=strlen(T); next[0]=len; a=0; while(a<len-1&&T[a]==T[a+1]) a++; next[1]=a; a=1; for(k=2;k<len;k++) { p=a+next[a]-1; L=next[k-a]; if(k-1+L>=p) { j=p-k+1>0?p-k+1:0; while(j+k<len&&T[j+k]==T[j]) j++; next[k]=j; a=k; } else next[k]=L; } } void get_extend() { get_next(); int a,p,L,k,j,slen,tlen,len; slen=strlen(S);tlen=strlen(T); len=slen>tlen?tlen:slen; a=0; while(a<len&&S[a]==T[a]) a++; extend[0]=a; a=0; for(k=1;k<slen;k++) { p=a+extend[a]-1; L=next[k-a]; if(k-1+L>=p) { j=p-k+1>0?p-k+1:0; while(j+k<slen&&j<tlen&&S[j+k]==T[j]) j++; extend[k]=j; a=k; } else extend[k]=L; } } int main() { int i; while(scanf("%s%s",S,T)!=EOF) { get_extend(); for(i=0;i<strlen(T);i++) printf("%d ",next[i]); printf("\n"); for(i=0;i<strlen(S);i++) printf("%d ",extend[i]); printf("\n"); } return 0; }
posted on 2013-06-30 11:19 后端bug开发工程师 阅读(366) 评论(0) 编辑 收藏 举报