rt,代码如下
#include <bits/stdc++.h>
#define ull unsigned long long
using namespace std;
const int N = 1e6 + 5, mod = 1e6 + 7, bas = 131;
const double eps = 1e-5;
ull p[N * 2], vis[N * 2], sum[N * 2];
int n, m, f[N * 2];
char s[N * 2];
vector<pair<int, int>> vec[35];
void init() {
p[0] = 1;
for (int i = 1; i <= N * 2; i++)
p[i] = p[i - 1] * bas;
}
inline int get_hash(ull x) {
int u = x % mod;
while (vis[u] && vis[u] != x) ++u;
return u;
}
int main() {
// freopen("language.in", "r", stdin);
// freopen("language.out", "w", stdout);
scanf("%d%d", &n, &m);
init();
for (int i = 1; i <= n; i++) {
scanf("%s", s + 1);
int len = strlen(s + 1);
ull cnt = 0;
for (int j = 1; j <= len; j++) {
cnt = cnt * bas + s[j] - 'a' + 1;
}
int u = get_hash(cnt);
vis[u] = cnt;
vec[s[len] - 'a' + 1].push_back({u, len});
}
while (m--) {
scanf("%s", s + 1);
int len = strlen(s + 1);
for (int i = 1; i <= len; i++)
sum[i] = sum[i - 1] * bas + s[i] - 'a' + 1;
f[0] = 1;
int cnt = 0;
for (int i = 1; i <= len; i++) {
f[i] = 0;
int x = s[i] - 'a' + 1;
for (int j = 0; j < vec[x].size(); j++) {
int len1 = vec[x][j].second;
if (i < len1 || !f[i - len1]) continue;
ull v = sum[i] - sum[i - len1] * p[len1];
int h = get_hash(v);
if (vis[h]) f[i] = 1, cnt = i;
}
}
printf("%d\n", cnt);
}
return 0;
}