//存在一个错误,使用一个外循环和使用嵌套循环,存在异常
//gets()得到一串含空格的字符串
#include <stdio.h>
#include <string.h>
#include <ctype.h>
/*int Match(char os[],char ot[])
{
int len1=strlen(os),len2=strlen(ot);//注意不要搞混strlen() 和 sizeof()
char s[25],t[75];
int count=0;
for(int i=0;i<=len1;i++)
{
if(isupper(os[i]))
s[i]=tolower(os[i]);
else
s[i]=os[i];
}
for(int i=0;i<=len2;i++)
{
if(isupper(ot[i]))
t[i]=tolower(ot[i]);
else
t[i]=ot[i];
}
// s[len1]='\0';
// t[len2]='\0';
for(int i=0;i<=len2-len1;)
{
int j;
for(j=0;j<len1;)
{
if(s[j]==t[i])
{
i++;
j++;
}
else
{
i=i-j+1;
j=0;
break;
}
}
if(j==len1)
{
int left,right;
left=i-j-1;
right=i;
if((left<0 || !isalpha(t[left])) && (right>=len2 || !isalpha(t[right])))
count++;
}
}
return count;
}*/
void GetNext(char s[],int next[])
{
int len=strlen(s);
next[0]=-1;
/*int j=0;
for(int k=1;k<len;)
{
if(s[k]==s[j])
{
j++;
k++;
next[k]=j;
}
else
{
while(j!=-1 && s[k]!=s[j])
j=next[j];
k++;
j++;
next[k]=j;
}
}*/
int j=-1;
for(int k=0;k<len;)
{
if(j==-1 || s[k]==s[j]){++k;++j;next[k]=j;}
else
j=next[j];
}
}
int KMP_Match(char os[],char ot[])
{
int len1=strlen(os),len2=strlen(ot);//注意不要搞混strlen() 和 sizeof()
char s[25],t[75];
int next[25];
int count=0;
for(int i=0;i<=len1;i++)
{
if(isupper(os[i]))
s[i]=tolower(os[i]);
else
s[i]=os[i];
}
for(int i=0;i<=len2;i++)
{
if(isupper(ot[i]))
t[i]=tolower(ot[i]);
else
t[i]=ot[i];
}
GetNext(s,next);
for(int i=0,j=-1;i<=len2-len1;)
{
if(j==-1 || s[j]==t[i])
{
i++;
j++;
}
else
{
j=next[j];
}
/*for(int i=0;i<=len2-len1;)
{
int j;
for(j=0;j<len1;)
{
if(s[j]==t[i])
{
i++;
j++;
}
else
{
//i=i-j+1;
//j=0;
j=next[j];
if(j==-1)
{
i++;
break;
}
}
}*/
/*for(;j<len1;)
{
if(j==-1 || s[j]==t[i])
{
i++;
j++;
}
else
{
j=next[j];
break;
}
}*/
if(j>=len1)
{
int left,right;
left=i-j-1;
right=i;
if((left<0 || !isalpha(t[left])) && (right>=len2 || !isalpha(t[right])))
count++;
j=0;
}
}
return count;
}
int main()
{
char keys[25][25],excuses[25][75];
int count[25];
int K,E;
int cas=0;
while(scanf("%d%d",&K,&E)==2)
{
++cas;
//getchar();
memset(count,0,sizeof(count));
int max=-1;
for(int i=0;i<K;i++)
scanf("%s",keys[i]);
getchar();//需要截取一个换行符
for(int i=0;i<E;i++)
gets(excuses[i]);
for(int i=0;i<E;i++)
{
for(int j=0;j<K;j++)
count[i]+=KMP_Match(keys[j],excuses[i]);
if(count[i]>max)
max=count[i];
}
printf("Excuse Set #%d\n",cas);
for(int i=0;i<E;i++)
//if(count[i]==max)
// printf("%s\n",excuses[i]);
printf("%s\t%d\n",excuses[i],count[i]);
printf("\n");
}
return 0;
}
//STL-set的应用:insert:插入,count:查找是否存在
//string-size()的应用:返回字符串的长度
//使用getline()切记要加一句getchar()来截取输入的换行符
#include <iostream>
#include <cstdio>
#include <cctype>
#include <string>
#include <set>
using namespace std;
int main()
{
int T(0);
const int Max=25;
struct Excuse
{
Excuse():counter(0){}
string words;
int counter;
};
int K,E;
while(cin>>K>>E)
{
set<string>keywords;
for(int i=0;i<K;i++)
{
string u;
cin>>u;
keywords.insert(u);
}
getchar();
Excuse r[Max];
for(int i=0;i<E;i++)
{
getline(cin,r[i].words)
string t(r[i].words);
for(int j=0;j<t.size();j++)
t[j]=tolower(t[j]);
for(int j=0;j<t.size();j++)
{
string t2;
while(isalpha(t[j]))
t2+=t[j++];
if(keywords.count(t2))
r[i].counter++;
}
}
int Max_count=-1;
cout<<"Excuse Set #"<<++T<<endl;
for(int i=0;i<E;i++)
if(r[i].counter>Max_count)
Max_count=r[i].counter;
for(int i=0;i<E;i++)
if(r[i].counter==Max_count)
cout<<r[i].words<<endl;
cout<<endl;
}
return 0;
}