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 }

 

posted on 2017-03-06 19:29 学无止境-1980 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/rdzrdz-acm/p/6511529.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值