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;
}

浙公网安备 33010602011771号