Description
给定text和pattern返回pattern在text中匹配的次数。
Input
第一行为用例个数,接下来是pattern和text。
Sample Input
3
BAPC
BAPC
AZA
AZAZAZA
VERDI
AVERDXIVYERDIAN
Sample Output
1
3
0
Solution
看毛片算法计算匹配次数板题。
/*
POJ 3461 Oulipo
统计子串出现的次数
*/
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
char W[10010], T[1000010];
int wlen, tlen;
int Next[10010];
void getNext()
{
int j, k;
j = 0;
k = -1;
Next[0] = -1;
while (j < wlen)
{
if (k == -1 || W[j] == W[k])
{
Next[++j] = ++k;
}
else
k = Next[k];
}
}
int KMP_count()
{
int ans = 0;
int i, j = 0;
if (wlen == 1 && tlen == 1)
{
if (W[0] == T[0])
return 1;
else
return 0;
}
getNext();
for (i = 0; i < tlen; i++)
{
while (j > 0 && T[i] != W[j])
j = Next[j];
if (W[j] == T[i])
j++;
if (j == wlen)
{
ans++;
j = Next[j];
}
}
return ans;
}
int main()
{
int tcase;
scanf("%d", &tcase);
while (tcase--)
{
scanf("%s%s", &W, &T);
wlen = strlen(W);
tlen = strlen(T);
printf("%d\n", KMP_count());
}
return 0;
}