[模板]AC自动机 洛谷3808 AC自动机
2018-01-12 21:12
239 查看
题目
AC自动机模板题分析
AC自动机就是字典树的思想加上kmp思想的产物。。。多画图就懂了。
来一波链接——AC自动机
code
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<queue> #include<algorithm> using namespace std; struct Tree{ int fail; int vis[26]; int num; }ac[1000000]; int n; int cnt=0; void Build(string s) { int l=s.length(); int now=0; for(int i=0;i<l;++i) { if(ac[now].vis[s[i]-'a']==0) ac[now].vis[s[i]-'a']=++cnt; now=ac[now].vis[s[i]-'a']; } ac[now].num+=1; } void Get_fail() { queue<int> Q; for(int i=0;i<26;++i) { if(ac[0].vis[i]!=0) { ac[ac[0].vis[i]].fail=0; Q.push(ac[0].vis[i]); } } while(!Q.empty()) { int u=Q.front(); Q.pop(); for(int i=0;i<26;++i) { if(ac[u].vis[i]!=0) { ac[ac[u].vis[i]].fail=ac[ac[u].fail].vis[i]; Q.push(ac[u].vis[i]); } else ac[u].vis[i]=ac[ac[u].fail].vis[i]; } } } int ac_Query(string s) { int l=s.length(); int now=0,ans=0; for(int i=0;i<l;++i) { now=ac[now].vis[s[i]-'a']; for(int t=now;t&&(ac[t].num!=-1);t=ac[t].fail) { ans+=ac[t].num; ac[t].num=-1; } } return ans; } int main() { cin>>n; for(int i=1;i<=n;++i) { string s; cin>>s; Build(s); } ac[0].fail=0; Get_fail(); string s; cin>>s; cout<<ac_Query(s)<<endl; return 0; }
相关文章推荐
- 统计难题 AC自动模板题
- 垃圾ac自动模板
- AC自动机模板1(【洛谷3808】)
- AC自动机模板(【洛谷3808】)
- [洛谷3808]【模板】AC自动机(简单版)
- 【模板】AC自动机(加强版) 洛谷3796 AC自动机
- hdu 2896(AC自动机模板题)
- HDU 2222 最简单的AC自动机套模板应用
- AC日记——【模板】二分图匹配 洛谷 P3386
- hdu5384 AC自己主动机模板题,统计模式串在给定串中出现的个数
- FreeMarker_模板引擎_代码自动生成器_源码下载
- C#程序通过模板自动创建Word文档.doc
- 数据结构--AC自动机--模板2
- 19.7 主动模式和被动模式 19.8 添加监控主机 19.9 添加自定义模板 19.10 处理图形中的乱码 19.11 自动发现
- POJ 1204 Word Puzzles | AC 自动鸡
- 文章标题 UVALive 4670 : Dominating Patterns (AC自动机模板题)
- Zabbix监控系统 (2) 之 主动模式和被动模式、添加监控主机、添加自定义模板、处理图形中的乱码、自动发现
- Delphi中WebBrowser自动填表模板
- AC自动机模板 LA4670
- smarty 模板引擎 中 自动转义问题