KMP模版

//f[i+1]是求与p[i]的下一个匹配的后一个数的下标
int
f[MAXN];
void getFail(char *p,int *f){ int m=strlen(p); f[0]=f[1]=0; for(int i=1;i<m;i++){ int j=f[i]; while(j&&p[i]!=p[j])j=f[j]; f[i+1]=p[i]==p[j]?j+1:0; } } void find(char *T,char *p,int *f){ int n=strlen(T); int m=strlen(p); getFail(p,f); int j=0; for(int i=0;i<n;i++){ while(j&&p[j]!=T[i])j=f[j]; if(p[j]==T[i])j++; if(j==m)printf("%d\n",i-m+1);//输出找到匹配的第一个下标 } }

 

posted @ 2013-03-17 19:54  z.arbitrary  阅读(154)  评论(0编辑  收藏  举报