题目大意:
给两个字符串(s1、s2),求s2中s1字符串出现的次数
解法KMP和哈希(先写KMP,哈希后面补上)
基础KMP 不做讲解 附AC代码
#include<iostream>
using namespace std;
void GetKMPNext(char *str, int *Next,int nLen)
{
Next[0] =-1;
int j = 0;
int k = -1;
while (j < nLen)
{
if (k == -1 || str[k] == str[j])
{
Next[++j] = ++k;
}
else
k = Next[k];
}
}
int main()
{
char StrA[1000001];
char StrB[10001];
int Next[10001];
int nNum = 0;
cin >> nNum;
for(int f = 0 ;f<nNum;f++)
{
int nMark = 0;
cin >> StrB;
cin >> StrA;
int LenA = strlen(StrA);
int LenB = strlen(StrB);
GetKMPNext(StrB,Next, LenB);
int j = 0;
bool bFlag = false;
for (int i = 0; i < LenA && j < LenB; )
{
if (StrA[i] == StrB[j] || j == -1)
{
i++;
j++;
}
else
{
j = Next[j];
}
if (j == LenB)
{
nMark++;
j = Next[j];
}
}
printf("%d\n", nMark);
}
return 0;
}