AC
#include <iostream>
#include<string>
using namespace std;
int main() {
int k, e, c = 0, l, kl, i, j, p, maxn; //k,e代表keyword与excuse的个数,c是最后输出的excuse的id,l,kl用来存储excuse与key的长度
string ew; //i,j,p用来for循环,maxn存储当前keyword最多的excuse,ew将excuse分割成与keyword一样长的子串
while (cin >> k >> e) {
maxn = 0;
c++;
string *key = new string[k];
string *exc = new string[e];
string *excc = new string[e]; //将exc中的字母转换成小写后,存入excc
int *num = new int[e]; //每个excuse中的keyword数量
for (i = 0; i < k; i++) cin >> key[i]; //输入keyword和excuse
getchar();
for (i = 0; i < e; i++) {
getline(cin,exc[i]) ;
num[i] = 0;
}
for (i = 0; i < e; i++) { //对每个excuse进行操作
excc[i] = exc[i];
l = excc[i].length();
for (j = 0; j < l; j++) { //大小写转换
if (excc[i][j] <= 'Z'&&excc[i][j] >= 'A')
excc[i][j] += 32;
}
for (j = 0; j < k; j++) { //依次用keyword进行匹配
kl = key[j].length();
for (p = 0; p + kl - 1 < l; p++) {
ew = excc[i].substr(p, kl);
//匹配成功后,可能有keyword在串首、串尾、串中3种情况
if (key[j] == ew) {
if (p == 0 ){
if(excc[i][p + kl] > 'z' || excc[i][p + kl] < 'a') {
num[i]++;
p += kl - 1;
}
}
else if (p + kl == l) {
if(excc[i][p - 1] > 'z' || excc[i][p - 1] < 'a') {
num[i]++;
p += kl - 1;
}
}
else if ((excc[i][p - 1] > 'z' || excc[i][p - 1] < 'a') && (excc[i][p + kl] > 'z' || excc[i][p + kl] < 'a')) {
num[i]++;
p += kl - 1;
}
}
}
}
if (num[i] > maxn) maxn = num[i]; //记录maxn
}
cout << "Excuse Set #" << c << endl; //输出
for (i = 0; i < e; i++) {
if (num[i] == maxn) {
cout <<exc[i] << endl;
}
}
cout << endl;
}
return 0;
}