首页 > 其他 > 详细

AC自动机简单版

时间:2021-05-23 14:43:46      阅读:24      评论:0      收藏:0      [点我收藏+]
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int maxn=1e6+10;
int trie[maxn][26],k,cnt[maxn],fail[maxn];
void insert(char *s){
    int len=strlen(s),p=0;
    for(int i=0;i<len;i++){
        int c=s[i]-‘a‘;
        if(!trie[p][c])trie[p][c]=++k;
        p=trie[p][c];
    }
    cnt[p]++;
}
void getfail(){
    queue<int>q;
    for(int i=0;i<26;i++)
        if(trie[0][i])q.push(trie[0][i]),fail[trie[0][i]]=0;
    while(!q.empty()){
        int t=q.front();q.pop();
        for(int i=0;i<26;i++){
            if(trie[t][i]){
                fail[trie[t][i]]=trie[fail[t]][i];
                q.push(trie[t][i]);
            }
            else{
                trie[t][i]=trie[fail[t]][i];
            }
        }
    }
}
int query(char *s){
    int len=strlen(s),p=0,ans=0;
    for(int i=0;i<len;i++){
        p=trie[p][s[i]-‘a‘];
        for(int i=p;i&&~cnt[i];i=fail[i]){
            ans+=cnt[i];cnt[i]=-1;
        }
    }
    return ans;
}
int main()
{
    int n;
    scanf("%d",&n);
    char s[maxn];
    while(n--){
        scanf("%s",s);
        insert(s);
    }
    getfail();
    scanf("%s",s);
    printf("%d\n",query(s));
}

  

AC自动机简单版

原文:https://www.cnblogs.com/qq1415584788/p/14800474.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!