刚刚看完Matrix67大大的博客,手痒就写了一个,本人是个大一新生,不喜勿喷。
这里我在VS2015上调试了好几次,发现果然VS里面有好多坑爹玩意,以后还是用Dev-C++老老实实写代码吧。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAX = 10001;
int P[MAX];
void get_next(char b[], int m)
{
int k = 0;
P[1] = 0;
for (int i = 2; i < m; i++)
{
while (k > 0 && b[k + 1] != b[i])
k = P[k];
if (b[k + 1] == b[i])
k++;
P[i] = k;
}
}
int KMP(char A[], int lenA, char B[], int lenB)
{
int res = 0,j=0;
get_next(B + 1, lenB);
for (int i = 0; i <= lenA; i++)
{
while (j > 0 && A[i] != B[j + 1])
j = P[j];
if (B[j + 1] == A[i])
j++;
if (j == lenB)
{
res++;
j = P[j];
}
}
return res;
}
int main()
{
char a[MAX], b[MAX];
int len_a, len_b;
int T;
scanf("%d", &T);
while (T--)
{
memset(P, 0, MAX);
scanf("%s", a + 1);
scanf("%s", b + 1);
len_a = strlen(a + 1); len_b = strlen(b + 1);
printf("%d\n", KMP(a + 1, len_a, b + 1, len_b));
}
return 0;
}