标签:kmp
描述
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
/*最初用的BF算法,后来又改成KMP算法,初次接触KMP算法,还不是太理解。 上代码*/ #include <stdio.h> #include <string.h> void GetNext(char *p,int *next) { int j = 0, k = -1; *next = -1; while(*(p+j)!=‘\0‘) { if(k==-1||*(p+j)==*(p+k)) { j++; k++; *(next+j)=k; } else k=*(next+k); } } int KMPMatch(char *a1, char *a2) { int next[11]; int i,j,num; i=j=num=0; GetNext(a1,next); while(*(a1+i)!=‘\0‘&&*(a2+j)!=‘\0‘) { if(-1 == i || *(a1+i)==*(a2+j)) { ++i; ++j; } else { i=next[i]; } if(*(a1+i)==‘\0‘) { ++num; j=j-i+1; i=0; } } return num; } int main() { int n; char a1[11], a2[1000]; scanf("%d",&n); getchar(); while(n--) { scanf("%s",a1); getchar(); scanf("%s",a2); getchar(); printf("%d\n",KMPMatch(a1,a2)); } return 0; }
标签:kmp
原文地址:http://anglecode.blog.51cto.com/5628271/1602637