107 AC自动机


视频链接:

 

P3808 【模板】AC 自动机(简单版)

#include 
#include 
#include 
#include 
using namespace std;

const int N=1000010;
int tr[N][26],cnt[N],idx,ne[N];
int n; char str[N];

void insert(char *s){ // 建Trie
    int p=0;
    for(int i=0; s[i]; i++){
        int e=s[i]-'a';
        if(!tr[p][e]) tr[p][e]=++idx;
        p=tr[p][e];
    }
    cnt[p]++;
}

void build(){ // 建AC自动机
    queue<int> q;
    for(int i=0; i<26; i++)
        if(tr[0][i]) 
            ne[tr[0][i]]=0,
            q.push(tr[0][i]);
    while(q.size()){
        int u=q.front(); q.pop();
        for(int i=0; i<26; i++){
            int v=tr[u][i];
            if(v) ne[v]=tr[ne[u]][i],
                  q.push(v);
            else tr[u][i]=tr[ne[u]][i];
        }
    }
}

int query(char *s){
    int ans=0;
    for(int c=0, i=0; s[c]; c++){
        i=tr[i][s[c]-'a'];
        for(int j=i; j&&~cnt[j]; j=ne[j])
            ans+=cnt[j], cnt[j]=-1;
    }
    return ans;
}

int main(){
    cin >> n;
    for(int i=0; i < n; i ++)
        cin >> str, insert(str);
    build();
    cin >> str;
    cout << query(str) << endl;
    return 0;
}

相关