您的位置:首页 > 其它

NYOJ 5 Binary String Matching

2015-01-12 21:57 260 查看
描述

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