模板 AC自动机
2018-10-30 06:36
330 查看
模板 AC自动机
code:
#include <iostream> #include <cstdio> #include <queue> #include <cstring> using namespace std; const int wx=2000017; inline int read(){ int sum=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0'; ch=getchar();} return sum*f; } struct AC_automation{ int tr[wx][26]; int val[wx],fail[wx]; int cnt; void insert(char * s){ int p=0; for(int i=0;s[i];i++){ int k=s[i]-'a'; if(!tr[p][k])tr[p][k]=++cnt; p=tr[p][k]; } val[p]++; } void build(){ queue<int > q; memset(fail,0,sizeof fail); for(int i=0;i<26;i++)if(tr[0][i])q.push(tr[0][i]); while(q.size()){ int p=q.front(); q.pop(); for(int i=0;i<26;i++){ if(tr[p][i]){ fail[tr[p][i]]=tr[fail[p]][i]; q.push(tr[p][i]); } else tr[p][i]=tr[fail[p]][i]; } } } int query(char * s){ int p=0,re=0; for(int i=0;s[i];i++){ p=tr[p][s[i]-'a']; for(int j=p;j&&~val[j];j=fail[j])if(val[j]!=-1)re+=val[j],val[j]=-1; } return re; } }ac; int n; char c[wx]; int main(){ n=read(); for(int i=1;i<=n;i++){ scanf("%s",c); ac.insert(c); } ac.build(); scanf("%s",c); printf("%d\n",ac.query(c)); return 0; }
相关文章推荐
- P3808 【模板】AC自动机(简单版)
- HDU 2222 ac自动机模板题
- 病毒侵袭(我的第二道AC自动机(模板进一步升级完善))
- AC自动机模板及对多模式匹配的理解
- hdu 2222 AC自动机模板题(指针版+数组版)
- AC自动机模板
- Trie树、AC自动机模板
- 病毒侵袭(ac自动机模板)
- 病毒侵袭持续中---hdu3065(AC自动机模板)
- 【模板】AC自动机
- AC自动机算法及模板
- HDU 2222 AC自动机 模板
- luogu P3808 【模板】AC自动机(简单版)
- HDU 2222 Keywords Search(AC自动机模板)
- 字典树模板/ac自动机模板
- ac自动机模板
- 杭电2896题 AC自动机模板题
- AC自动机模板
- AC自动机模板
- hdu 2222 Keywords Search(AC自动机模板)