题目描述
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
题目大意:输入两个字符串A,B,只包含0或者1,有多少次A出现在B的字符串中,例如B是1001110110,A是11,有3次A出现在B中
输入
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
AC码:
#include<iostream>
#include<string.h>
#include<string>
#include<cstring>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
int count=0;
string a,b;
cin>>a>>b;//输入两串数组a b
string::size_type fond;
fond=b.find(a);
if(fond==string::npos )
{
cout<<0<<endl;
continue;
}
while(fond!=string::npos )
{
count++;
fond=b.find(a,fond+1);
}
cout<<count<<endl;
}
return 0;
}
/*
string 中的find(string&,location) ,在一个字符串中查找指定的单个字符或字符组。
如果找到,返回首次匹配的开始位置,如果没有找到匹配的内容,则返回 string::npos。,
一般有2个输入参数,一个是待查询的字符串,一个是查询的起始位置,默认起始位置为0.
*/
利用KMP算法也行
/******KMP算法*********/
#include<cstring>
#include<iostream>
char s[1010];//B
char t[11];// A
int next[1010];
using namespace std;
void Next()
{//求模式串t[]的next函数值并存入数据next
int i=0;
int j=-1;
next[0]=-1;
int len_t=strlen(t);//记录t[]的长度
while(i<len_t-1)
{
if(j==-1||t[i]==t[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
int KMP()
{//利用模式串t[]的next函数求t[]在主串s[]中第 个字符之后的位置
int i=-1;
int j=-1;
int len_t=strlen(t);//记录t的长度
int len_s=strlen(s);//记录s的长度
int count=0;
Next();//调用Next()函数
while(i<len_s)
{//两串未比较到串尾
if(j==-1||s[i]==t[j])
{//继续比较后续字符
i++;
j++;
}
else
{ //模式串向右移
j=next[j];
}
if(j==len_t)
{//匹配成功,接着比较后,下面的,看是否还有与之匹配的
i=i-j;
j=-1;
count++;
}
}
return count;//模式串出现的次数
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s %s",t,s);
printf("%d\n",KMP());
}
return 0;
}