您的位置:首页 > 其它

nyoj -5 Binary String Matching 【kmp】

2015-10-10 19:56 537 查看

Binary String Matching

时间限制:3000 ms | 内存限制:65535 KB

难度:3

描述 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


分析:


这道题没有太多的解释,裸的kmp,不过其中一点要注意。


代码:


[code]#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define maxn 1010

using namespace std;
char s1[maxn],s2[maxn];
int next[maxn];
int len1,len2;
int ans;

void getp()
{
int i=0,j=-1;
next[0]=-1;
while(i<len1)
{
if(j==-1||s1[i]==s1[j])//如果换成s1[i]==s2[j],则查找的数据不能出现重复查找过的,就像最后一组数据。
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}

void kmp()
{
getp();
int i=0,j=0;
while(i<len2)
{
if(j==-1||s1[j]==s2[i])
{
i++;
j++;
if(j==len1)
ans++;
}
else
j=next[j];
}
}

int main()
{
int n;
scanf("%d",&n);
while(n--)
{
ans=0;
scanf("%s%s",s1,s2);
len1=strlen(s1);
len2=strlen(s2);
kmp();
printf("%d\n",ans);
}
return 0;
}

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: