首页 > 代码库 > POJ3461-KMP算法

POJ3461-KMP算法

求失配函数的思路:
我们设主串为M,子串为N,则 失配函数存在这样的递推关系,
求nex[i+1]时:
使j=nex[i]。
1、若N[j]==N[i]则nex[i+1]=j+1;
2、若N[j]!=N[i]则使j=nex[j];
3、若j=0则直接进行步骤1;
就这么简单。。但是好难理解。

POJ3461附标程:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 using namespace std;
 5 char n[10002],m[1000002];
 6 int t;
 7 void KMP(char *a,char *b){
 8      int ans=0;
 9      //在b串中找a出现的次数
10      int nex[10002]={0};
11      int alen=strlen(a),blen=strlen(b);
12      
13      //下面开始生成失配函数 
14      for(int i=1;i<alen;i++){
15              int j=nex[i];
16              while(j!=0 && a[i]!=a[j]) j=nex[j];
17              if(a[i]==a[j]) nex[i+1]=j+1;
18         /*一个值得注意的地方:alen也有它的失配函数nex[alen],
19        当匹配到b串中完全出现a串后就要跳转至nex[alen]处匹配*/ 
20      } 
21      
22      int j=0;
23      for(int i=0;i<blen;i++){
24              while(j!=0 && b[i]!=a[j]) j=nex[j]; 
25              if(b[i]==a[j]) j++;
26              if(j==alen) ans++;
27      }
28      
29      printf("%d\n",ans);
30 }      
31 int main(){
32     scanf("%d",&t);
33     for(int i=0;i<t;i++){
34             scanf("%s%s",n,m);
35             KMP(n,m);
36     }
37     return 0;
38 }

 

POJ3461-KMP算法