MnZn 求助 ACAM
查看原帖
MnZn 求助 ACAM
503792
Svemit楼主2025/2/1 14:58

萌新初学 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;
}
2025/2/1 14:58
加载中...