AC自动机

能自动AC的机器(不是

简单版

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
int n, cnt, ans, fail[N], tr[N][30], flag[N];
string s, t;
queue<int> q;
vector<int> ask;
void build(string s){
	int p = 0;
	for(int i = 0; i < s. size(); i++){
		if(!tr[p][s[i] - 'a']) tr[p][s[i] - 'a'] = ++cnt;
		p = tr[p][s[i] - 'a']; 
	}
	ask.push_back(p);
}
void ac(){
	for(int i = 0; i < 26; i++){
		if(!tr[0][i]) continue;
		fail[tr[0][i]] = 0;
		q.push(tr[0][i]);
	}
	while(!q.empty()){
		int u = q.front(); q.pop();
		for(int i = 0; i < 26; i++){
			if(tr[u][i]){
				q.push(tr[u][i]);
				fail[tr[u][i]] = tr[fail[u]][i];
			}
			else tr[u][i] = tr[fail[u]][i];
		}
	}
}
int main(){
	cin >> n;
	for(int i = 1; i <= n; i++){
		cin >> s;
		build(s);
	}
	cin >> t;
	ac();
	int u = 0;
	for(int i = 0; i < t.size(); i++){
		u = tr[u][t[i] - 'a'];
		int v = u;
		while(v && !flag[v]){
			flag[v] = 1;
			v = fail[v];
		}
	}
	for(int i = 0; i < ask.size(); i++){
		if(flag[ask[i]]) ans++;
	}
	cout << ans;
	return 0;
}

简单版II

#include<bits/stdc++.h>
#define m(a) memset(a, 0, sizeof(a))
using namespace std;
const int N = 20005;
int n, cnt, ans, fail[N], tr[N][30], flag[N];
string s, t, in[N];
queue<int> q;
vector<int> ask, fmp[N];
void build(string s){
	int p = 0;
	for(int i = 0; i < s. size(); i++){
		if(!tr[p][s[i] - 'a']) tr[p][s[i] - 'a'] = ++cnt;
		p = tr[p][s[i] - 'a']; 
	}
	ask.push_back(p);
}
void ac(){
	for(int i = 0; i < 26; i++){
		if(!tr[0][i]) continue;
		fail[tr[0][i]] = 0;
		q.push(tr[0][i]);
	}
	while(!q.empty()){
		int u = q.front(); q.pop();
		for(int i = 0; i < 26; i++){
			if(tr[u][i]){
				q.push(tr[u][i]);
				fail[tr[u][i]] = tr[fail[u]][i];
			}
			else tr[u][i] = tr[fail[u]][i];
		}
	}
	for(int i = 1; i <= cnt; i++) fmp[fail[i]].push_back(i);
}
void dfs(int n){
	for(auto v : fmp[n]){
		dfs(v);
		flag[n] += flag[v];
	}
}
int main(){
	while(1){
		for(int i = 1; i <= n; i++) in[i] = ' ';
		cin >> n; if(!n) return 0;
		for(int i = 0; i <= cnt; i++) fmp[i].clear();
		cnt = 0;
		m(fail); m(tr); m(flag);
		ask.clear();
		int maxn = -0x3f3f3f3f;
		for(int i = 1; i <= n; i++){
			cin >> s;
			in[i] = s;
			build(s);
		}
		cin >> t;
		ac();
		int p = 0;
		for(int i = 0; i < t.size(); i++){
			flag[tr[p][t[i] - 'a']]++;
			p = tr[p][t[i] - 'a'];
		} 
		dfs(0);
		for(int i = 0; i < ask.size(); i++){
			maxn = max(maxn, flag[ask[i]]);
		}
		cout << maxn << endl;
		for(int i = 0; i < ask.size(); i++){
			if(flag[ask[i]] == maxn){
				cout << in[i + 1] << endl;
			}
		}
	}	
}

AC自动机

#include<bits/stdc++.h>
#define m(a) memset(a, 0, sizeof(a))
using namespace std;
const int N = 1e6 + 5;
int n, cnt, ans, fail[N], tr[N][30], flag[N];
string s, t;
queue<int> q;
vector<int> ask, fmp[N];
void build(string s){
	int p = 0;
	for(int i = 0; i < s. size(); i++){
		if(!tr[p][s[i] - 'a']) tr[p][s[i] - 'a'] = ++cnt;
		p = tr[p][s[i] - 'a']; 
	}
	ask.push_back(p);
}
void ac(){
	for(int i = 0; i < 26; i++){
		if(!tr[0][i]) continue;
		fail[tr[0][i]] = 0;
		q.push(tr[0][i]);
	}
	while(!q.empty()){
		int u = q.front(); q.pop();
		for(int i = 0; i < 26; i++){
			if(tr[u][i]){
				q.push(tr[u][i]);
				fail[tr[u][i]] = tr[fail[u]][i];
			}
			else tr[u][i] = tr[fail[u]][i];
		}
	}
	for(int i = 1; i <= cnt; i++) fmp[fail[i]].push_back(i);
}
void dfs(int n){
	for(auto v : fmp[n]){
		dfs(v);
		flag[n] += flag[v];
	}
}
int main(){
	cin >> n;
	for(int i = 1; i <= n; i++){
		cin >> s;
		build(s);
	}
	cin >> t;
	ac();
	int p = 0;
	for(int i = 0; i < t.size(); i++){
		flag[tr[p][t[i] - 'a']]++;
		p = tr[p][t[i] - 'a'];
	} 
	dfs(0);
	for(int i = 0; i < ask.size(); i++){
		cout << flag[ask[i]] << endl;
	}
	return 0;
}
posted @ 2025-11-13 18:24  Turkey_VII  阅读(4)  评论(0)    收藏  举报