AC自動機模板
阿新 • • 發佈:2020-08-11
AC自動機模板
#include<bits/stdc++.h> using namespace std; const int N=1e6+10; char s[N]; struct AC_{ int ch[N][26],size; int end[N],fail[N]; void insert(char *s){ int len=strlen(s),p=0; for(int i=0;i<len;i++){ int c=s[i]-'a'; if(!ch[p][c])ch[p][c]=++size; p=ch[p][c]; } end[p]++; } void build(){ queue<int>q; memset(fail,0,sizeof(fail)); for(int i=0;i<26;i++){ if(ch[0][i])q.push(ch[0][i]); } while(!q.empty()){ int u=q.front();q.pop(); for(int c=0;c<26;c++){ if(ch[u][c])fail[ch[u][c]]=ch[fail[u]][c],q.push(ch[u][c]); else ch[u][c]=ch[fail[u]][c]; } } } int query(char *t){ int p=0,res=0; for(int i=0;t[i];i++){ p=ch[p][t[i]-'a']; for(int j=p;j&&~end[j];j=fail[j])res+=end[j],end[j]=-1; } return res; } }ac; int main(){ int n;scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",s); ac.insert(s); } ac.build(); scanf("%s",s); cout<<ac.query(s)<<endl; }