来源:POJ3461
KMP一水,学了好几天
代码:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN = 10010;
int nxt[MAXN];
char m[MAXN];
char p[MAXN*100];
int lenm,lenp;
void get_next(){
int i=0,j;
memset(nxt,0,sizeof(nxt));
nxt[0]=j=-1;
while(i<lenm){
if(j==-1||m[i]==m[j]){
i++;j++;
if(m[i]!=m[j]){
nxt[i] = j;
}
else
nxt[i] = nxt[j];
}
else
j = nxt[j];
}
}
int ans=0;
void kmp(){
int i,j;
i=j=0;
while(i<lenp){
if(j==-1||m[j] == p[i]){
i++;
j++;
}
else
j=nxt[j];
if(j==lenm){
ans++;
j = nxt[j];
}
}
}
int main(){
int T;
scanf("%d",&T);
getchar();
while(T--){
gets(m);
gets(p);
lenm = strlen(m);
lenp = strlen(p);
//cout<<m<<endl<<p<<endl;
get_next();
ans = 0;
kmp();
cout<<ans<<endl;
}
return 0;
}
本文深入探讨了KMP算法的实现原理,并通过一个具体的代码示例展示了如何使用C++来实现KMP字符串匹配算法。从获取next数组到进行模式匹配,文章详细解释了每个步骤的逻辑,并提供了一个完整的程序来解决字符串匹配问题。
676

被折叠的 条评论
为什么被折叠?



