【HPU-2016校赛-B】영어

来源:互联网 发布:python老男孩10期网盘 编辑:程序博客网 时间:2024/06/08 15:31


点击打开链接


영어
Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu
Submit Status Practice HPU 1187

Description

你们猜猜영어是什么意思?

??????????????????????

"English is very importan!",诸如此类的声音不停的在Ocean的耳边出现。

现在Ocean为了自己的小小梦想开始了英语的复习之路,但是他碰到一个小问题,需要你来帮助他。


Ocean有一个只包含小写字母('a'-'z')和大写字母('A'-'Z')的字符串strstr,他想知道strstr里面一共包含了多少个"English"子串。 
如:字符串"EnglishEnglish"包含了22个"English"子串。 

PS:子串是指连续的一段字符串,题目要求的合法子串必须是不重叠的。

本题大家请使用scanf("%s", str);输入。

Input

第一行输入一个整数TT,代表有TT组测试数据。 
每组数据输入一个字符串strstr 

注:1<=T<=1001<=|str|<=100001<=T<=100,1<=|str|<=10000。 

Output

对每组测试数据,输出一个整数代表strstr里面一共包含了多少个"English"子串。

Sample Input

3EnglishEnglishEnglishEnglispEnglishEnglisH

Sample Output

211



//                   题解: 算法   KMP模板直接用

//代码如下:

#include <stdio.h>#include <stdlib.h>#include <string.h>char s[11111],t[10]={'E','n','g','l','i','s','h'};int next[11111];int kmp(char *s,int n,char *t,int m){int i = 0;int j = 0;int k = 0;while (i < n ) { if (j == -1 || s[i] == t[j])   {   ++i;   ++j;   if (j == m)    k++;              }else  j = next[j]; }return k;}void getnext(char *t,int m){int i = 0;int  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;scanf ("%d",&m);while (m--) { scanf ("%s",&s); int l1,l2; l1 = strlen(s); l2 = strlen(t); getnext(t,l2);printf ("%d\n",kmp(s,l1,t,l2)); }return 0;}






原创粉丝点击