题目大意:给定两个字符串,计算第一个字符串在第二个字符串中出现的次数。
解题思路:直言不讳的kmp
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int Next[100050];
void kmp_pre(char s[], int len)
{
int i = 0, j = -1;
Next[0] = -1;
while(i < len)
{
while(j != -1 && s[i] != s[j]) j = Next[j];
Next[++i] = ++j;
}
}
int kmp_count(char s[], int len_s, char ss[], int len_ss)
{
kmp_pre(s, len_s);
int i = 0, j = 0;
int cnt= 0;
while(i < len_ss)
{
while(j != -1 && ss[i] != s[j]) j = Next[j];
i++; j++;
if(j >= len_s)
{
cnt++;
j = Next[j];
}
}
return cnt;
}
char s1[10050];
char s2[1000050];
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
memset(Next, 0, sizeof(Next));
scanf("%s%s", s1, s2);
printf("%d\n", kmp_count(s1, strlen(s1), s2, strlen(s2)));
}
return 0;
}