ac自动机代码模板
2018-02-20 16:02
218 查看
简介
给出待查找字符串s1,s2,s3…sn
给出目标文本S
在S中查找有多少个s1,s2….sn
maxn是文本的长度
maxt是建立trie图状态个数
代码为杭电2222的模板题
给出待查找字符串s1,s2,s3…sn
给出目标文本S
在S中查找有多少个s1,s2….sn
maxn是文本的长度
maxt是建立trie图状态个数
#include<bits/stdc++.h> using namespace std; const int maxn=1000006; const int maxt=500005; struct Aho { struct StateTable { int next[26]; int cnt,fail; }stateTable[maxt]; queue<int> que; int Size; void init() { while(!que.empty()) que.pop(); for(int i=0;i<maxt;i++) { memset(stateTable[i].next,0,sizeof(stateTable[i].next)); stateTable[i].cnt=stateTable[i].fail=0; } Size=1; } void Insert(char *S)//插入待查找串s1,s2...sn { int n=strlen(S); int now=0; for(int i=0;i<n;i++) { char c=S[i]; if(!stateTable[now].next[c-'a']) { stateTable[now].next[c-'a']=Size++; } now=stateTable[now].next[c-'a']; } stateTable[now].cnt++; } void build()//建立失配指针的状态转移 { stateTable[0].fail=-1; que.push(0); while(!que.empty()) { int u=que.front(); que.pop(); for(int i=0;i<26;i++) { if(stateTable[u].next[i]) { if(u==0) { stateTable[stateTable[u].next[i]].fail=0; } else { int v=stateTable[u].fail; while(v!=-1) { if(stateTable[v].next[i]) { stateTable[stateTable[u].next[i]].fail=stateTable[v].next[i]; break; } v=stateTable[v].fail; } if(v==-1) stateTable[stateTable[u].next[i]].fail=0; } que.push(stateTable[u].next[i]); } } } } int Get(int u)//统计当前节点所包含的待查找串,以及当前节点失配指针指向的状态所包含的待查找串的和 { int res=0; while(u) { res+=stateTable[u].cnt; stateTable[u].cnt=0; u=stateTable[u].fail; } return res; } int match(char *S)//查找文本 { int now=0,res=0; int n=strlen(S); for(int i=0;i<n;i++) { char c=S[i]; if(stateTable[now].next[c-'a']) { now=stateTable[now].next[c-'a']; } else { int p=stateTable[now].fail; while(p!=-1&&stateTable[p].next[c-'a']==0) { p=stateTable[p].fail; } if(p==-1) { now=0; } else { now=stateTable[p].next[c-'a']; } } if(stateTable[now].cnt) { res+=Get(now); } } return res; } }aho; int T,N; char s[maxn]; int main() { ios::sync_with_stdio(false); cin>>T; while(T--) { cin>>N; aho.init(); for(int i=0;i<N;i++) { cin>>s; aho.Insert(s); } aho.build(); cin>>s; cout<<aho.match(s)<<endl; } return 0; }
代码为杭电2222的模板题
相关文章推荐
- 业务逻辑层JDBC模板代码(使用Manager代理类,具有控制事务和管理connection功能)
- Csdn Blog模板CSS代码(9):初升的太阳
- 用预置模板降低JS代码与HTML结构的耦合
- Java使用 VelocityEngine模板引擎快速生成HTML等各种代码
- AC自动机模板 hdoj2222 UVA-11468
- 常用js模板代码-模块化
- Velocity 读取字符串模板生成代码
- Eclipse代码注释模板——code templates
- myeclipse中java代码注释模板问题
- velocity 代码模板生成
- hdu 2222 ac自动机模板题
- hdu2222 AC自动机入门 指针型模板
- IntelliJ2017:如何将一段代码变成可以便捷输入的模板
- AC自动机模板
- Android Stadio 代码模板 fbc的使用
- C++类模板 实现队列的链式存储结构算法 《数据结构》(北京科海) 部分代码摘抄,自己编写运行
- AC自动机学习小记 Hdu 2222 Keywords Search (模板)
- Magento 发送邮件代码(使用数据库中模板)
- 记录AS混淆代码模板
- Ajax通用模板实现代码