大意:
给出两个字符串s1,s2,求s1中包含多少不重叠的子串=s2
样例:
aaaaaa aa
abcde a2
输出:
3
0
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1001;
int nxt[MAXN];
string s1,s2;
void make_next(string s)
{
for(int i=1,j=0;i<s.length();++i)
{
while(j&&s[i]!=s[j])
j=nxt[j-1];
if(s[i]==s[j])
++j;
nxt[i]=j;
}
}
int kmp(string s1,string s2)
{
int f=0,sum=0;
for(int i=0,j=0;i<s1.length();++i)
{
while(j&&s1[i]!=s2[j])
j=nxt[j-1];
if(s1[i]==s2[j])
++j;
if(j==s2.length())
{
sum++;
j=0;
}
}
return sum;
}
int main()
{
while(cin>>s1&&s1!="#")
{
cin>>s2;
make_next(s2);
cout<<kmp(s1,s2)<<endl;
}
return 0;
}