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