首页 > 其他 > 详细

AC自动机

时间:2021-02-05 23:26:11      阅读:30      评论:0      收藏:0      [点我收藏+]

AC自动机,自动AC机?

代码

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int N=1e6+5;
queue<int> q;
char s[N],tmp[N];
int trie[N][26],eend[N],fail[N],tot,n;
inline void insert(char *s){
  int len=strlen(s),p=0;
  for(int k=0;k<len;k++){
    int ch=s[k]-a;
    if(trie[p][ch]==0) trie[p][ch]=++tot;
    p=trie[p][ch];
  }
  eend[p]=1;
}
inline void getfail(){
  for(int i=0;i<26;i++) if(trie[0][i]) fail[trie[0][i]]=0,q.push(trie[0][i]);
  while(!q.empty()){
    int u=q.front();q.pop();
    for(int i=0;i<26;i++){
      if(trie[u][i]) fail[trie[u][i]]=trie[fail[u]][i],q.push(trie[u][i]);
      else trie[u][i]=trie[fail[u]][i];
    }
  }
}
inline int query(char *s){
  int len=strlen(s),res=0,p=0;
  for(int i=0;i<len;i++){
    p=trie[p][s[i]-a];
    for(int t=p;t&&eend[t]!=-1;t=fail[t]) res+=eend[t],eend[t]=-1;
  }
  return res;
}
int main(){
  cin>>n;
  for(int i=1;i<=n;i++){
    cin>>s;
    insert(s);//建棵tree
  }
  getfail();
  cin>>tmp;
  cout<<query(tmp);
  return 0;
}

 

AC自动机

原文:https://www.cnblogs.com/hhhd-/p/14379490.html

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