[LuoguP3808] 模板AC自动机(简单版)数组版
Posted GoldenPotato的OI世界
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LuoguP3808] 模板AC自动机(简单版)数组版相关的知识,希望对你有一定的参考价值。
待填坑
Code
#include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std; const int N=1000000+1000; struct AC_AutoMation { #define root 0 static const int sigma_size=26; struct node { int nxt[sigma_size],sum,fa,fail; }t[N*5]; int tot; void Insert(char c[]) { int now=root,len=strlen(c+1); for(int i=1;i<=len;i++) { if(t[now].nxt[c[i]-‘a‘]==0) t[now].nxt[c[i]-‘a‘]=++tot; now=t[now].nxt[c[i]-‘a‘]; } t[now].sum++; } void Build() { queue <int> Q; for(int i=0;i<sigma_size;i++) if(t[root].nxt[i]!=0) Q.push(t[root].nxt[i]); while(!Q.empty()) { int now=Q.front(); Q.pop(); for(int i=0;i<sigma_size;i++) if(t[now].nxt[i]!=0) { int temp=t[now].fail; while(t[temp].nxt[i]==0 and temp!=root) temp=t[temp].fail; t[t[now].nxt[i]].fail=t[temp].nxt[i]; Q.push(t[now].nxt[i]); } } } int Query(char c[]) { int ans=0,len=strlen(c+1),now=root; for(int i=1;i<=len;i++) { int x=c[i]-‘a‘; while(t[now].nxt[x]==0 and now!=root) now=t[now].fail; now=t[now].nxt[x]; int temp=now; while(temp!=root) { if(t[temp].sum>=0) { ans+=t[temp].sum; t[temp].sum=-1; temp=t[temp].fail; } else break; } } return ans; } #undef root }trie; int n; char c[N]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",c+1); trie.Insert(c); } trie.Build(); scanf("%s",c+1); printf("%d",trie.Query(c)); return 0; }
以上是关于[LuoguP3808] 模板AC自动机(简单版)数组版的主要内容,如果未能解决你的问题,请参考以下文章