萌新初学 OI,60 pts 求调。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 4e2 + 5, S = 26, M = 2e6 + 5;
int n, m;
int ch[N][S], ed[N], idx;
int fail[N];
int f[M];
void insert(string s) {
int u = 0;
for (auto c : s) {
int &v = ch[u][c - 'a'];
if (!v) v = ++ idx;
u = v;
}
int len = s.size();
ed[u] |= 1 << (len - 1);
}
void build() {
queue<int> q;
for (int i = 0; i < S; i ++) if (ch[0][i]) q.push(ch[0][i]);
while (q.size()) {
int u = q.front(); q.pop();
for (int i = 0; i < S; i ++) {
int &v = ch[u][i];
if (v) fail[v] = ch[fail[u]][i], q.push(v);
else v = ch[fail[u]][i];
}
}
}
int sol(string s) {
int len = s.size();
s = " " + s;
int cur = 0;
int msk = 1;
f[0] = 1;
for (int i = 1; i <= len; i ++) {
cur = ch[cur][s[i] - 'a'];
int tmp = ed[cur] & msk;
if (tmp != 0) f[i] = 1;
else f[i] = 0;
msk = ((msk << 1) | f[i]) & ((1 << 20) - 1);
}
for (int i = len; i >= 1; i --) if (f[i]) return i;
return 0;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
cin >> n >> m;
for (int i = 1; i <= n; i ++) {
string s;
cin >> s;
insert(s);
}
build();
for (int i = 1; i <= m; i ++) {
string s;
cin >> s;
cout << sol(s) << "\n";
}
return 0;
}