KMP算法

来源:互联网 发布:淘宝店铺模板源代码 编辑:程序博客网 时间:2024/06/03 18:13

KMP算法使用来弥补BF算法的不足(避免不必要的回溯)。避免的方法是由模式串决定(模式串自解),而不是又目标串决定。

http://poj.org/problem?id=3461

#include <stdio.h>#include <string.h>#define M 10010char strSour[M],strTarget[1000010];int next[M];int count;void getNext(){int i,j;int slen=strlen(strSour);for (j=next[0]=-1,i=1;i<slen;i++){while(j>-1 && strSour[j+1]!=strSour[i]) j=next[j];if (strSour[j+1]==strSour[i]){j++;}next[i]=j;}}void kmp(){int i=0,j=0;int slen,tlen;count=0;getNext();slen=strlen(strSour);tlen=strlen(strTarget);for (j=-1,i=0;i<tlen;i++){while(j>-1 && strSour[j+1]!=strTarget[i]) j=next[j];if (strSour[j+1]==strTarget[i]){j++;}if (j==slen-1){count++;j=next[j];}}}int main(){int n;scanf("%d",&n);while(n--){scanf("%s%s",strSour,strTarget);kmp();printf("%d\n",count);}return 0;}