KMP参考《算法竞赛入门经典训练指南》
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#define N 1000010
using namespace std;
char P[N],T[N];
int f[N],n;
void getfail(int* f,char* P){
memset(f,0,sizeof(f));
int len=strlen(P);
for(int i=1;i<len;i++){
int j=f[i];
while(j&&P[i]!=P[j])j=f[j];
f[i+1]=P[i]==P[j]?++j:0;
}
}
int KMP(char* P,char* T,int* f){
int ans=0,lenP=strlen(P),lenT=strlen(T);
getfail(f,P);int j=0;
for(int i=0;i<lenT;i++){
while(j&&P[j]!=T[i])j=f[j];
if(P[j]==T[i])j++;
if(j==lenP)ans++;
}
return ans;
}
int main(){
freopen("1.in","r",stdin);
scanf("%d",&n);gets(P);
while(n--){
gets(P);gets(T);
printf("%d\n",KMP(P,T,f));
}
return 0;
}
本文详细介绍KMP算法的工作原理及其实现过程。通过具体的C++代码示例,讲解如何构造失败函数,并利用该函数进行字符串匹配。适用于理解KMP算法在实际应用中的效率优势。
4万+

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



