hdu 2222 Keywords Search (ac自动机)
2015-09-03 21:20
316 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2222
题意:求有多少个模式串出现在文本串里面。
分析:ac自动机模版题。说一下自己对ac自动机的理解,①fail指针指向的位置:父亲节点的fail指针指向的位置的一个孩子节点的位置,并且这个孩子节点所代表的字符与当前位置的字符相同。②fail指针的作用:利用fail指针可以在trie中找到一个最长前缀与当前串的后缀匹配。③对ac自动机的改造:把不存在的孩子节点“补上”,由于该节点并不在trie中,匹配到当前该节点位置的时候可以直接跳过,跳到该节点的fail指针指向的位置。
代码:
题意:求有多少个模式串出现在文本串里面。
分析:ac自动机模版题。说一下自己对ac自动机的理解,①fail指针指向的位置:父亲节点的fail指针指向的位置的一个孩子节点的位置,并且这个孩子节点所代表的字符与当前位置的字符相同。②fail指针的作用:利用fail指针可以在trie中找到一个最长前缀与当前串的后缀匹配。③对ac自动机的改造:把不存在的孩子节点“补上”,由于该节点并不在trie中,匹配到当前该节点位置的时候可以直接跳过,跳到该节点的fail指针指向的位置。
代码:
#include <iostream> #include <cstring> #include <cstdio> #include <queue> using namespace std; const int maxn = 5e5+6; const int kd = 26; struct Trie { int son[maxn][kd],end[maxn],fail[maxn]; int root,cnt; int newnode() { end[cnt]=0; fill(son[cnt],son[cnt]+kd,-1); return cnt++; } void Init() { cnt=0; root=newnode(); } void Insert(char str[]) { int index,i,now=root; for(i=0;str[i];i++) { index=str[i]-'a'; if(son[now][index]==-1) son[now][index]=newnode(); now=son[now][index]; } ++end[now]; } void findfail() { queue <int > q; int i,j,now; fail[root]=root; for(i=0;i<kd;i++) if(son[root][i]==-1) son[root][i]=root; else { fail[son[root][i]]=root; q.push(son[root][i]); } while(!q.empty()) { now=q.front(); q.pop(); for(i=0;i<kd;i++) if(son[now][i]==-1) son[now][i]=son[fail[now]][i]; else { fail[son[now][i]]=son[fail[now]][i]; q.push(son[now][i]); } } } int Query(char str[]) { int temp,i,now=root,index,ret=0; for(i=0;str[i];i++) { index=str[i]-'a'; now=son[now][index]; temp=now; while(temp!=root) { ret+=end[temp]; end[temp]=0; temp=fail[temp]; } } return ret; } }ac; char T[maxn<<1],M[maxn]; int main() { int ncase,n; scanf("%d",&ncase); while(ncase--) { ac.Init(); scanf("%d",&n); while(n--) { scanf("%s",M); ac.Insert(M); } ac.findfail(); scanf("%s",T); printf("%d\n",ac.Query(T)); } return 0; }
相关文章推荐
- 2015暑期多校训练第一场 1,2,3
- php大力力 [045节] 兄弟连高洛峰 PHP教程 2014年[已发布,点击下载]
- hihoCoder #1162 : 骨牌覆盖问题·三 (矩阵快速幂,DP)
- HTTP 状态码的完整列表
- 关于结构体的操作符重载和定义在内部的函数
- 继承中的构造方法
- Python
- 函数指针数组
- AJAX学习笔记
- newssoj1004逐个击破attack(排序+并查集)
- jQuery基础学习4——jQuery容错性
- 背包问题
- 蓝懿-打飞机图片,内存管理基础 刘国斌老师
- poj 2155 Matrix(二维树状数组)
- C++模板类编写需要注意的一点
- [转]在Ubuntu中安装Python科学计算环境
- [转载]Qt之中文显示(QMessageBox、QLineEdit右键菜单等)
- 蓝汛ChinaCache助力大阅兵全球直播
- 运用Polygon类绘制六边形
- UVALive 7043 International Collegiate Routing Contest 字典树