问题 B: 영어
时间限制: 1 Sec 内存限制: 128 MB提交: 817 解决: 243
题目描述
你们猜猜영어是什么意思?
??????????????????????
"English is very importan!",诸如此类的声音不停的在Ocean的耳边出现。
现在Ocean为了自己的小小梦想开始了英语的复习之路,但是他碰到一个小问题,需要你来帮助他。
如:字符串"EnglishEnglish"包含了 2 个"English"子串。
PS:子串是指连续的一段字符串,题目要求的合法子串必须是不重叠的。
本题大家请使用scanf("%s", str);输入。
输入
第一行输入一个整数
T
,代表有
T
组测试数据。
每组数据输入一个字符串 str 。
注: 1<=T<=100,1<=|str|<=10000。
每组数据输入一个字符串 str 。
注: 1<=T<=100,1<=|str|<=10000。
输出
对每组测试数据,输出一个整数代表
str
里面一共包含了多少个"English"子串。
样例输入
3
EnglishEnglish
EnglishEnglisp
EnglishEnglisH
样例输出
2
1
1
#include<stdio.h>
#include<string.h>
char s[10005];
char t[10]="English";
int ans;
int next[1000];
int cmp(char *s, int n, char *t, int m)
{
ans=0;
int i,j;
i=j=0;
while(i<n)
{
if(j==-1||s[i]==t[j])
{
i++;
j++;
if(j==m)
ans++;
}
else
j=next[j];
}
return ans;
}
void getnext(char *t,int m)
{
int i,j;
i=j=0;
next[0]=-1;
j=next[i];
while(i<m)
{
if(j==-1||t[i]==t[j])
next[++i]=++j;
else
j=next[j];
}
}
int main()
{
int m,n,l1,l2,i,j,k;
scanf("%d",&k);
getchar();
while(k--)
{
n=j=0;
scanf("%s",s);
l1=strlen(s);
l2=7;
getnext(t,l2);
printf("%d\n",cmp(s,l1,t,l2));
}
return 0;
}