收藏 分享(赏)

ac自动机基础入门.ppt

上传人:无敌 文档编号:302717 上传时间:2018-03-26 格式:PPT 页数:22 大小:255.50KB
下载 相关 举报
ac自动机基础入门.ppt_第1页
第1页 / 共22页
ac自动机基础入门.ppt_第2页
第2页 / 共22页
ac自动机基础入门.ppt_第3页
第3页 / 共22页
ac自动机基础入门.ppt_第4页
第4页 / 共22页
ac自动机基础入门.ppt_第5页
第5页 / 共22页
点击查看更多>>
资源描述

1、AC自动机,by 李翔,AC自动机,不是accept自动机。是Aho-Corasick 造出来的。所以你懂的,用途,字符串的匹配问题多串的匹配问题例如给几个单词 acbs,asf,dsef,再给出一个 很长的文章,acbsdfgeasf问在这个文章中,总共出现了多少个单词,或者是单词出现的总次数。,实现的原理,形象的说:KMP+trie树(字典树) KMP,之前学过的。为什么用到了这个呢? 因为也是一种没有多余回溯的算法。 什么是trie树(字典树)?,Trie树,有神马特点,有一个空的根节点。对于一般的trie数是解决用英文字母组成文章。所以每个节点会有26个子节点(指针)。,构造的过程,开

2、始的时候有一个root,过程,要在该树中插入一个单词she,过程,再加一个单词shr。,过程,再插入say和her等,这样一个trie树就搞定了,如何与kmp联系在一起?,关键是在trie树上 加了一种fail指针。Fail指针的用途:就像是kmp中的next的数组。在字符串失配的时候确定转移的节点。,先看到底是什么样的,这只显示了e的失配指针。例如匹配文章:sher,构造fail指针的原理,根据父亲节点的fail指针来构造子节点的fail指针。动态的过程:下面是拷贝人家的ppt!编号为0的节点可以忽略之。,如何高效的构造前缀指针,ROOT1号节点的前缀指针指向0号节点,接下来按照BFS顺序构

3、造每个节点的前缀指针,定义虚拟节点0号节点,0号节点的所有连出的字边都连向ROOT1号节点,2号节点:父亲是1号节点,连接字符为A,查找父亲的前缀指针0号节点,是否有通过A连接的儿子。有!于是2号节点的前缀指针指向1号节点,3号节点:父亲是1号节点,连接字符为B,查找父亲的前缀指针0号节点,是否有通过B连接的儿子。有!于是3号节点的前缀指针指向1号节点,4号节点:父亲是2号节点,连接字符为B,查找父亲的前缀指针1号节点,是否有通过B连接的儿子。有!于是4号节点的前缀指针指向3号节点,5号节点:父亲是3号节点,连接字符为A,查找父亲的前缀指针1号节点,是否有通过A连接的儿子。有!于是5号节点的前

4、缀指针指向2号节点,8号节点:父亲是7号节点,连接字符为B,查找父亲的前缀指针5号节点,是否有通过B连接的儿子。没有,继续查找5号节点的前缀指针2号节点是否有通过B连接的儿子。有!于是8号节点的前缀指针指向4号节点,7号节点:父亲是4号节点,连接字符为A,查找父亲的前缀指针3号节点,是否有通过A连接的儿子。有!于是7号节点的前缀指针指向5号节点,6号节点:父亲是3号节点,连接字符为B,查找父亲的前缀指针1号节点,是否有通过B连接的儿子。有!于是6号节点的前缀指针指向3号节点,至此,这棵树的前缀指针我们就设计完成了!,对于一个插入了n个模式串的单词前缀树构造其前缀指针的时间复杂度为:O(len(

5、i),如何解决开始给的问题,在所有的绿色节点上做上标记。一旦访问到这个节点,就记录下。这样就能解决上面的问题。,hdu2222,5 /单词数she /单词hesay shr her Yasherhs/文章,问出现单词数的和,代码实现,struct node int next26; int fail; int count; void init() memset(next, -1, sizeof(next); fail = 0; count = 0; s500005;,在树中插入单词,void ins() int len = strlen(str); int i, j, ind; for(i =

6、ind = 0; i len; i+) j = stri - a; if(sind.nextj = -1) ssind.init(); sind.nextj = sind+; ind = sind.nextj; sind.count+;,在这里的操作对于不同的题目一般有3种不同的操作。1:sind.count+;这个是在解决出现总次数的时候是这样处理的。2:sind,count=1;这个是在ac自动机上进行dp的时候经常用的。3.新加一个标记id。这个是在处理有哪些单词出现过。,void make_fail() qin = qout = 0; int i, ind, ind_f; for(i = 0; i 0 /子节点的fail根据父节点fail指针的搞定 ,int fd() int ct = 0; int di, i, ind, p; int len = strlen(des);/这个是文章 for(di = ind = 0; di 0 ,拓展,在自动机上进行dp要大家自己去理解,题目,Poj1204 4052(题目在4044上下载)Hdu22223065,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报