题目链接 http://acm.nyist.net/JudgeOnline/problem.php?pid=5
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
这道题就是数据结构中bf算法的应用。y 表示长的字符串,x 表示短的字符串,i 表示y的第 i 个元素,j 表示 x 的第 j 个元素。文字说不明白,大家看一下代码吧,很容易理解的。
代码:
#include<iostream>
#include<cstring>
using namespace std;
int bf(string x,string y)
{
int i=0,j=0,sum=0; //sum表示匹配的个数
while(i<y.size()&&j<x.size())
{
if(y[i]==x[j]) //如果对应的元素一样
{
i++;
j++;
if(j==x.size()) //如果已经匹配到了小字符串的最后一位后面的一位,那么说明这个子串存在于大字符串中
{
sum++; //匹配的个数++
i=i-x.size()+1; //让i指向 匹配成功 的子串的下一个字符
j=0; //让j指向小字符串的第一个字符
}
}
else
{
i=i-j+1; //这是一个规律,如果匹配失败i=i-j+1,记住即可
j=0; //如果匹配失败,小字符串需要从头开始再次开始匹配
}
}
return sum;
}
int main()
{
string x,y;
int t;
cin>>t;
while(t--)
{
cin>>x>>y;
cout<<bf(x,y)<<endl;
}
return 0;
}