开了 O2 7,9 RE 不开 O2 9 过了,7 WA 了。码风良好,求调
#include <bits/stdc++.h>
using namespace std;
const int N = 150, M = 1e6 + 10, S = 80;
int n;
char s[N][S];
char v[M];
int tr[M][26], fa[M], idx;
int q[M], ed[M];
int cnt[N];
int w[N];
void insert(char *S, int pos)
{
int p = 0;
for (int i = 0; S[i]; i ++ )
{
int u = S[i] - 'a';
if (!tr[p][u]) tr[p][u] = ++ idx;
p = tr[p][u];
}
ed[p] = pos;
}
void build()
{
int hh = 0, tt = -1;
for (int i = 0; i < 26; i ++ ) if (tr[0][i]) q[ ++ tt] = tr[0][i];
while (hh <= tt)
{
int t = q[hh ++ ];
for (int i = 0; i < 26; i ++ )
if (tr[t][i]) fa[tr[t][i]] = tr[fa[t]][i], q[ ++ tt] = tr[t][i];
else tr[t][i] = tr[fa[t]][i];
}
}
int main()
{
while (scanf("%d", &n), n)
{
memset(tr, 0, sizeof tr); idx = 0;
memset(fa, 0, sizeof fa); memset(cnt, 0, sizeof cnt);
memset(ed, 0, sizeof ed);
for (int i = 1; i <= n; i ++ ) scanf("%s", s[i]), insert(s[i], i);
build();
int p = 0; scanf("%s", v);
for (int i = 0; v[i]; i ++ )
{
int w = p = tr[p][v[i] - 'a'];
while (w) { cnt[ed[w]] ++ ; w = fa[w]; }
}
for (int i = 1; i <= n; i ++ ) w[i] = i;
sort(w + 1, w + 1 + n, [](int x, int y) { return cnt[x] > cnt[y] || (cnt[x] == cnt[y] && x < y); } );
printf("%d\n", cnt[w[1]]);
for (int i = 1; i <= n; i ++ ) if (cnt[w[i]] == cnt[w[1]]) printf("%s\n", s[w[i]]);
}
return 0;
}