AC自动机


AC自动机,自动AC机?

代码

#include 
#include 
#include 
#include 
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){
    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){
    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;
}