1、这里套用AC 自动机模板,关键是统计出现出现最多的模式串的个数,
还要输出这个模式串(如果有多个,按输入的顺序输出)
2、 用结构体 node 记录每一个字符串的匹配信息, 匹配完了在排序,最后输出
struct node
{
int cnt; // 在文本串出现的次数
int index; // 是第几个模式串
}record[N];
3、因为要进行多组的模式串匹配文本串,每一组测试数据完成后,都要初始化
int ch[N][26], idx;
int ne[N]; //回跳边
int isWord[N];// isWord[k] 表示k节点是否是一个模式串
int mp[N]; // idx --> 第几个字符串
memset(record, 0, sizeof(node) * (n + 1));
memset(mp, 0, sizeof(int) * (idx + 1));
memset(isWord, 0, sizeof(int) * (idx + 1));
memset(ne, 0, sizeof(int) * (idx + 1));
memset(ch, 0, sizeof(int) * (idx + 1) * 26);
idx = 0;
#include <bits/stdc++.h>
using namespace std;
const int N = 11000;
char str[160][80];
int ch[N][26], idx;
int ne[N];
int isWord[N];
int mp[N];
struct node
{
int cnt;
int index;
}record[N];
char t[1000010];
int n;
bool cmp(node a, node b)
{
if(a.cnt != b.cnt)
return a.cnt > b.cnt;
return a.index < b.index;
}
void insert(int k)
{
int p = 0;
for(int i = 0; str[k][i]; ++i)
{
int j = str[k][i] - 'a';
if(!ch[p][j])
ch[p][j] = ++idx;
p = ch[p][j];
}
if(!isWord[p])
{
mp[p] = k;
record[k].index = k, record[k].cnt = 0;
isWord[p] = 1;
}
}
void build()
{
queue<int> q;
for(int i = 0; i < 26; ++i)
{
if(ch[0][i])
q.push(ch[0][i]);
}
while(!q.empty())
{
int u = q.front(); q.pop();
for(int i = 0; i < 26; ++i)
{
int v = ch[u][i];
if(v)
{
ne[v] = ch[ne[u]][i], q.push(v);
}else{
ch[u][i] = ch[ne[u]][i];
}
}
}
}
int query(char* s)
{
int ans = 0;
for(int k = 0, i = 0; s[k]; ++k)
{
i = ch[i][s[k] - 'a'];
for(int j = i; j; j = ne[j])
{
if(isWord[j])
record[mp[j]].cnt++;
}
}
return ans;
}
int main()
{
while(scanf("%d", &n) && n)
{
for(int i = 0; i < n; ++i)
{
scanf("%s", str[i]);
insert(i);
}
build();
scanf("%s", t);
query(t);
sort(record, record + n, cmp);
printf("%d\n", record[0].cnt);
for(int i = 0; i < n; ++i)
{
if(record[i].cnt == record[0].cnt)
printf("%s\n", str[record[i].index]);
else
break;
}
memset(record, 0, sizeof(node) * (n + 1));
memset(mp, 0, sizeof(int) * (idx + 1));
memset(isWord, 0, sizeof(int) * (idx + 1));
memset(ne, 0, sizeof(int) * (idx + 1));
memset(ch, 0, sizeof(int) * (idx + 1) * 26);
idx = 0;
}
return 0;
}