Loading

AC自动机

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

 

posted @ 2021-02-05 19:31  Miraii  阅读(78)  评论(1)    收藏  举报