求失配函数的思路:
我们设主串为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 }
时间: 2024-11-19 16:11:08