给你一个字符串W 一个模式串T 问W在T中出现的次数
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char W[10005],T[10005];
int next[10005];
void get_next(int len) //得到W的next数组
{
next[0]=-1;
int i=0,j=-1;
while(i<len)
{
if(j==-1||W[i]==W[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
int KMP() //进行比较两个字符串
{
int l1=strlen(W);
int l2=strlen(T);
get_next(l1);
int i=0,j=0,ans=0;
while(i<l2)
{
if(j==-1||T[i]==W[j])
{
i++;
j++;
}
else
j=next[j];
if(j==l1)
{
ans++;
j=next[j];
}
}
return ans;
}
int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%s%s",W,T);
int ans=KMP();
cout<<ans<<endl;
}
}
PS:KMP最关键的就是要找到与主串匹配的模式串的next数组,根据next数组来确定失配时,模式串移动的位置