数单词
时间限制:
2000 ms | 内存限制:
120000 KB
难度:
4
-
描述
-
为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语。LYH本来以为自己在6月份的考试中可以通过六级,可是没想到,成绩出来以后,居然没有通过。所以他不得不付出更多的时间来学习英语。要想通过六级,最基本的要求就是词汇量。为了能够更快的记住一些陌生单词,LYH有时会找一些英语文章来读。今天早上,LYH又找了一篇文章。读之前,他突然萌生出一个想法:文章中哪些单词出现的次数最多呢?
-
输入
-
第一行输入一个整数T,表示有T组测试数据(1≤T≤200)。
对于每组测试数据,第一行输入一个整数n(1≤n≤150),表示LYH要查询的单词数量(有些单词可能会重复出现)。
接下来n行,每行输入一个单词,长度不大于100。
最后一行包含一个由小写字母组成的英语文章(字符串),长度不大于10^6。
输出
-
对于每组数据,第一行输出一个整数,表示单词出现的次数。
然后按照输入顺序,每行输出一个出现次数最多的单词。如果有重复出现的单词,把它们全部输出。
样例输入
-
2 3 good oo one goodafternooneveryone 1 to welcometotopcoder
样例输出
-
2 oo one 2 to
-
第一行输入一个整数T,表示有T组测试数据(1≤T≤200)。
【分析】AC自动机
码此题时没有想到此方法,考虑到数据规模比较大使用了加强版的KMP,结果还是超时。。
先占个坑吧,过后更。
#include <stdio.h>
#include <string.h>
int T,n;
int maxans;
char passage[1000005];
struct word
{
char content[105];
int ans;
} wd[155];
int nextval[105];
void getNextval(char *s,int *nextval)
{
int i,j,len;
i=0,j=-1;
len=strlen(s);
nextval[i]=j;
while(i<len)
{
if(j==-1 || s[i]==s[j])
{
i++;
j++;
if(s[i]!=s[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=nextval[j];
}
}
int SearchwdandCount(char *s,struct word t)
{
int i,j;
int lens,lent;
int ans;
getNextval(t.content,nextval);
i=j=ans=0;
lens=strlen(s);
lent=strlen(t.content);
while(i<lens && j<lent)
{
if(j==-1 || s[i]==t.content[j])
{
i++;
j++;
}
else
j=nextval[j];
if(j==lent)
{
ans++;
j=nextval[j];
}
}
return ans;
}
int main()
{
int i;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",wd[i].content);
wd[i].ans=0;
}
scanf("%s",passage);
maxans=0;
for(i=0;i<n;i++)
{
wd[i].ans=SearchwdandCount(passage,wd[i]);
if(wd[i].ans>maxans)
maxans=wd[i].ans;
}
printf("%d\n",maxans);
for(i=0;i<n;i++)
{
if(wd[i].ans==maxans)
printf("%s\n",wd[i].content);
}
}
return 0;
}