AC自动机做法,只拿了5分qwq
查看原帖
AC自动机做法,只拿了5分qwq
417018
dark_moon楼主2022/5/9 10:31
#include<bits/stdc++.h> 
#define ll long long
using namespace std;
ll n, m, son[1000][30], son1[1000][30], idx, nxt[1000], E[2000005], ee[1000];
pair <int, char> e[1000];
char s[25], t[2000005];
vector <int> v[30];
queue <int> q;
void insert(){
	int l = strlen(s + 1), p = 0;
	for(int i = 1; i <= l; i ++){
		if(son[p][s[i] - 'a']);
		else
		son[p][s[i] - 'a'] = ++idx;
		p = son[p][s[i] - 'a'];
	}
	e[p] = make_pair(l, s[l]);
}
void nxtt(){
	for(int i = 0; i < 26; i ++){
		if(son[0][i])
		q.push(son[0][i]);
	}
	int p;
	while(q.size()){
		p = q.front();
		for(int i = 0; i < 26; i ++){
			if(son[p][i])
			nxt[son[p][i]] = son[nxt[p]][i], q.push(son[p][i]);
			else
			son[p][i] = son[nxt[p]][i];
		}
		q.pop();
	}
}
int answer(){
	int l = strlen(t + 1), p = 0, ans = 0;
	memset(E, 0, sizeof(E));
	memset(ee, 0, sizeof(ee));
	E[0] = 1;
	for(int i = 1; i <= l; i ++){
		int c = t[i] - 'a';
		p = son[p][c];
		int temp = p;
		while(temp){
			if(e[temp].first && ee[temp] == 0)
			v[e[temp].second - 'a'].push_back(e[temp].first), ee[temp] = 1;
			temp = nxt[temp];
		}
		for(int j = 0; j < v[c].size(); j ++)
		if(E[i - v[c][j]] >= 0 && E[i - v[c][j]])
		ans = i, E[i] = 1;
	}
	return ans;
}
int main(){
	scanf("%lld%lld", &n, &m);
	for(int i = 1; i <= n; i ++){
		scanf("%s", s + 1);
		insert();
	}
	nxtt();
	for(int i = 1; i <= m; i ++){
		scanf("%s", t + 1);
		printf("%d\n", answer());
	}
	return 0;
}
2022/5/9 10:31
加载中...