题目信息:
题目描述
Given two strings A and B, whose alphabet consist only ‘0’ and ‘1’. Your task is only to tell how many times does A appear as a substring of B? For example, the text string B is ‘1001110110’ while the pattern string A is ‘11’, you should output 3, because the pattern A appeared at the posit
输入
The first line consist only one integer N, indicates N cases follows. In each case, there are two lines, the first line gives the string A, length (A) <= 10, and the second line gives the string B, length (B) <= 1000. And it is guaranteed that B is always longer than A.
输出
For each case, output a single line consist a single integer, tells how many times do B appears as a substring of A.
样例输入
3
11
1001110110
101
110010010010001
1010
110100010101011
样例输出
3
0
3
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 1005
using namespace std;
int Next[N],lenx,leny;
char T[N],S[10*N];
void get_next( ) {
int i,j;
i=0;
j=-1;
Next[0]=-1;
while(i<lenx) {
if(j==-1||T[i]==T[j]) {
++i;
++j;
if(T[i]!=T[j])
Next[i]=j;
else
Next[i]=Next[j];
} else
j=Next[j];
}
}
void KMP() {
int i=0;
int j=0;
int cnt=0;
get_next();
while(i<leny) {
if(j==-1||S[i]==T[j]) {
++i;
++j;
if(j==lenx)
++cnt;
} else
j=Next[j];
}
printf("%d\n",cnt);
}
int main() {
int t;
scanf("%d",&t);
getchar();
while(t--) {
gets(T);
gets(S);
lenx=strlen(T);
leny=strlen(S);
KMP();
}
}