可以用朴素的模式匹配算法,也可以使用KMP算法,KMP算法所用的时间较短
普通版
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string s1,s2;
while(cin >> s1)
{
if(s1=="#")
return 0;
cin >> s2;
int i=0;
int j=0;
int cnt=0;
while(i<s1.length())
{
if(s1[i]==s2[j])
{
i++;
j++;
}
else
{
i=i-j+1;//将i向后移动一个,继续匹配
j=0;
}
if(j==s2.length())
{
j=0;
cnt++;
}
}
cout << cnt << endl;
}
return 0;
}
KMP
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int nextt[1005];
string s1,s2;
int cnt;
void getnext()
{
memset(nextt,0,sizeof(nextt));
int i=0,j=-1;
nextt[0]=-1;
while(i<s2.length())
{
if(j==-1 || s2[j

本文介绍了如何利用KMP算法解决HDU 2087问题,强调了在KMP算法匹配成功后,如何正确地进行后续匹配,指出在匹配成功时,应将j重置为0,而非计算next[j]以避免计算可重叠部分。
185

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



