首页 > 代码库 > 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算法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。