https://www.luogu.com.cn/problem/P3796
直接暴力枚举即可。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 1e6 + 10, M = 75 * 155;
int n;
char s[N], str[155][75];
int trie[M][26], tot, nxt[M], q[M];
int pot[155], f[M];
void insert(char s[], int x) {
int p = 0;
for(int i = 1; s[i]; i++) {
int t = s[i] - 'a';
if(trie[p][t] == 0) trie[p][t] = ++tot;
p = trie[p][t];
}
pot[x] = p;
}
void ACAM() {
int hh = 0, tt = -1;
for(int i = 0; i < 26; i++)
if(trie[0][i]) q[++tt] = trie[0][i];
while(hh <= tt) {
int p = q[hh++];
for(int t = 0; t < 26; t++) {
int i = trie[p][t];
if(i == 0) continue;
int j = nxt[p];
while(j && trie[j][t] == 0) j = nxt[j];
if(trie[j][t]) j = trie[j][t];
nxt[i] = j;
q[++tt] = i;
}
}
}
int main() {
while(cin >> n && n) {
memset(trie, 0, sizeof(trie));
memset(nxt, 0, sizeof(nxt));
memset(f, 0, sizeof(f));
tot = 0;
for(int i = 1; i <= n; i++) {
scanf("%s", str[i] + 1);
insert(str[i], i);
}
ACAM();
scanf("%s", s + 1);
for(int i = 1, j = 0; s[i]; i++) {
int t = s[i] - 'a';
while(j && trie[j][t] == 0) j = nxt[j];
if(trie[j][t]) j = trie[j][t];
int k = j;
while(k) {
f[k]++;
k = nxt[k];
}
}
int Min = 0;
for(int i = 1; i <= n; i++)
Min = max(Min, f[pot[i]]);
printf("%d\n", Min);
for(int i = 1; i <= n; i++)
if(f[pot[i]] == Min) {
for(int j = 1; str[i][j]; j++)
printf("%c", str[i][j]);
puts("");
}
}
return 0;
}