就是常规KMP算法
给定一个数组 查看里面最多能有多少子串 从左到右一个个数 数到一个子串ans++
KMP算法的描述 戳这里
#include<iostream>
#include<string>
using namespace std;
#define maxn 1000
int nextt[maxn];
void cal_next(string str)
{
nextt[0]=-1;
int k=0;
for(int i=1;i<str.size();i++)
{
while(k>-1&&str[k+1]==str[i])
{
k=nextt[k];
}
if(str[k+1]==str[i])
{
k++;
}
nextt[i]=k;
}
}
int KMP(string str,string ptr)
{
int k=-1;
int ans=0;
cal_next(ptr);
for(int i=0;i<str.size();i++)
{
while(k>-1&&ptr[k+1]!=str[i])
{
k=nextt[k];
}
if(ptr[k+1]==str[i])
{
k++;
}
if(k==ptr.size()-1)
{
ans++;
k=-1;//****记得把k调回最初的位置
}
}
return ans;
}
int main()
{
string str;
string ptr;
while(cin>>str&&str!="#")
{
cin>>ptr;
int ans=KMP(str,ptr);
cout<<ans<<endl;
}
}