#include
#include
using namespace std;
class KMP
{
public:
// 构造函数
KMP(string pattern, string origin)
:pat(pattern), ori(origin)
{
next = new int[pattern.size() + 1];
next[0] = -1;
calcuNext(); // 计算next数组
count = 0;
}
// 计算next数组
void calcuNext()
{
int i = 0, j = -1;
while(i < pat.size())
{
if(j == -1 || pat[i] == pat[j])
next[++i] = ++j;
else
j = next[j];
}
}
// 用KMP算法匹配
void kmpMatch()
{
int i = 0, j = 0;
while(i < ori.size())
{
if(j == -1 || ori[i] == pat[j])
{
++i;
++j;
}
else
j = next[j];
if(j == pat.size()) ++count;
}
}
// 返回源串中模式串出现的次数
int getCount() const
{
return count;
}
private:
//
string ori; // 源串
string pat; // 模式串
int* next; // next数组(针对pat)
// 每次移位的个数只与模式串有关
int count; // 模式串在源串中出现的次数
};
int main()
{
int n;
cin >> n;
while (n--)
{
string pat, ori;
cin >> pat >> ori;
KMP kmp(pat, ori);
kmp.kmpMatch();
cout << kmp.getCount() << endl;
}
return 0;
}
上面一段代码,你参考一下,里面有注释~