- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一个字符al:可以视作从Trie树的一个节点沿着al所在的边走下去。而如果没有就要新建。 B:可以视作从Trie树的某个节点返回它的父亲。 P:可以视作Trie树的某个节点这里存储了一个单词,用sum[]统计的话就是sum[]+1. 咱们可以发现,这样看的话,Trie树的节点个数最后最多也只有O(N)的,因为只有添加字符al的时候才可能新建节点。 所以空间复杂度这里保证了,顺便可以发现题目中的这些操作和Trie树的操作很相像。 那么怎么求出X在Y中出现了多少次。 由上几道题目咱们知道,包含某一个节点所代表的字符串的节点,就是能沿着fail指针走到这个节点的节点。 那么某个节点y到根节点的路径上包含了多少个fail指针指向x的节点,那么答案就是多少。 这里的正解做法是利用了dfs… 考虑fail指针是由一个深度深的节点指向一个深度浅的节点,所以fail指针可以构成一棵树(这个和Kmp的next[]构成的树是一样的) 咱们可以发现,所有包含字符串x的节点,都是fail树上字符串x的节点为根的子树的节点。 咱们可以用dfs序,从自动机的图dfs,每一次dfs到一个点,咱们就给这个点+1,dfs完一个点就-1. 显然可以证明,dfs到某一个节点y的时候,只有节点y到根节点的所有节点+1,其余节点为0 然后咱们的任务就是求x的fail子树的权值和即可。然后这个用dfs序也是可以做的…剩余的就是单点修改区间求值,可以用树状数组,线段树等东西就可以了。 人有了知识,就会具备各种分析能力, 明辨是非的能力。 所以我们要勤恳读书,广泛阅读, 古人说“书中自有黄金屋。 ”通过阅读科技书籍,我们能丰富知识, 培养逻辑思维能力; 通过阅读文学作品,我们能提高文学鉴赏水平, 培养文学情趣; 通过阅读报刊,我们能增长见识,扩大自己的知识面。 有许多书籍还能培养我们的道德情操, 给我们巨大的精神力量, 鼓舞我们前进。 * 其实上面所提到的自动机的概念也是为了引出下面几种和字符串有关的数据结构: AC自动机 要聊到AC自动机就得先讲Trie树。 Trie树又叫字典树。它的每条边都代表一个字符,它从根节点开始往下走,走到某一个节点,经过的路上的边的字符连成一个字符串S,这个字符串S就是该节点所代表的字符串。 显然,根节点代表的字符串就是空串。 Trie树一般只要求两个操作,一个是往Trie树里面插入一个字符串,一个是查询Trie树里面是否有某个字符串。 插入字符串很简单,按位一个个字符插入就可以了,假设现在走到了节点i,要插入的字符是’a’,那么就先检查节点i的’a’边是否连有儿子j,如果有,就走到j,继续插入下一个字符,如果没有,就新建一个节点j,将节点i的’a’边连向j,然后走到j继续插入下一个字符。 而查询只要按位一个个字符走下去就可以了,如果走到某一个节点i,接下来的字符比如是’a’,而若’a’连向了一个儿子j,则走到j,继续重复上面操作,儿子不存在的话,则说明原Trie树没有这个单词,返回。 Trie树的时间复杂度,设插入的字符串的长度为n,则插入的复杂度是O(n) 设查询的字符串的长度为n,则查询的复杂度就是O(n),当然如果Trie树最深深度mn的话,那么复杂度就是O(m) Trie树实际上有一个很棒的思想,那就是动态开节点,一开始的Trie树只有一个根节点,而每次插入字符串,如果当前走不下去了,就新建一个节点,这样子的话空间复杂度就和插入的字符串的长度有关了。也就是说,对于问题没有涉及到的路,咱们不开设相应的内存,每次问题涉及到一个新的从前没有的路,咱们临时开辟内存。 这个思想也可以用于线段树。 一开始的线段树只有一个大区间[0,n],然后每一次涉及到一个区间[p,q]的操作,咱们只临时建立和[p,q]相关的区间的节点。 这个思想可以对付一些可能区间[0,10^9],而实际上涉及到的区间只有10^5等很小的数量级的问题。 Poj 2418 Hardwood Species 题目大意:给出n个字符串(n=10^6),每个字符串长度不超过30,有可能有相同的字符串存在,不同的字符串最多10000种。统计不同种类的字符串出现的次数,并按照字典序排序后输出。 比如: A C A B A 出现了2次,B出现了1次,C出现了一次按照顺序应输出 2 1 1 我们建立Trie树,每次都插入一个新的字符串。 那么怎么统计个数呢? 咱们给每一个节点设一个信息域num[],表示该节点所代表的字符串有多少个,然后每次插入一个字符串走到终点,将终点节点的num[]+1 然后按字典序走边,遍历一遍就可以了… 复杂度?O(输入字符串总长度) 空间复杂度也是的。 CF Round #311 div2 EAnn and Half-Palindrome 简要翻译:定义半回文串
文档评论(0)