题目还没看:看了翻译版的
虽然学习了KMP,但是面对输入字符串,以及如何计算字符串的长度,我还表示头疼,现在终于可以解决啦
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 1000002;
const int M = 10002;
int P[M], Count = 0;
void Next(char *t, int m)
{
int j = 0;
P[1] = 0;
for (int i = 2; i <= m; i++)
{
while (j>0 && t[j + 1] != t[i])
j = P[j];
if (t[i] == t[j + 1])
j++;
P[i] = j;
}
}
void KMP(char *t, char *s, int m, int n)
{
P[0] = 0;
int j = 0;
for (int i = 1; i <= n; i++)
{
while (j>0 && s[i] != t[j + 1])
j = P[j];
if (s[i] == t[j + 1])
j++;
if (j == m)
{
Count++;
j = P[j];
}
}
}
int main()
{
int n, m, k;
scanf("%d", &n);
char s[N], t[M];
while (n--)
{
Count = 0;//每次要重新计数,都死在这里
memset(P,0,sizeof(P));
scanf("%s%s", t + 1, s + 1);
int m = strlen(t + 1);//输入字符串
int k = strlen(s + 1);
Next(t, m);
KMP(t, s, m, k);
printf("%d\n", Count);
}
return 0;
}