KMP模板题
输入字符串A和字符串B,求字符串A在字符串B中出现的次数
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
const int maxn=1000011;
int tot;
void kmp(string a,string b)
{
int i,j;
int p[maxn];
j=-1;
memset(p,-1,sizeof(p));
for(i=1;i<a.length();i++)
{
while(j>-1 && a[j+1]!=a[i]) j=p[j];
if(a[j+1]==a[i]) j++;
p[i]=j;
}
j=-1; tot=0;
for(i=0;i<b.length();i++)
{
while(j>-1 && a[j+1]!=b[i]) j=p[j];
if(a[j+1]==b[i]) j++;
if(j==a.length()-1)
{
tot++;
j=p[j];
}
}
}
int main()
{
int T;
string a,b;
cin>>T;
while(T--)
{
cin>>a>>b;
kmp(a,b);
cout<<tot<<endl;
}
return 0;
}
本文介绍了一种高效的字符串匹配算法——KMP算法,并通过一个具体的模板题来演示如何使用该算法来寻找一个字符串在另一个字符串中出现的所有位置及次数。文章详细展示了KMP算法的实现过程,包括前缀函数的构建和模式匹配的具体步骤。
4182

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



