摘要:
http://www.cppblog.com/reiks/archive/2009/08/28/94629.aspx/*RMQ(RangeMinimum/MaximumQuery)问题:RMQ问题是求给定区间中的最值问题。当然,最简单的算法是O(n)的,但是对于查询次数很多(设置多大100万次),O(n)的算法效率不够。可以用线段树将算法优化到O(logn)(在线段树中保存线段的最值)。不过,Sparse_Table算法才是最好的:它可以在O(nlogn)的预处理以后实现O(1)的查询效率。下面把SparseTable算法分成预处理和查询两部分来说明(以求最小值为例)。预处理:预处理使用DP的 阅读全文
摘要:
http://tieba.baidu.com/f?kz=754580296转自 FHNstephen的空间 后缀数组是处理字符串的有力工具。后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也并不逊色,而且它比后缀树所占用的内存空间小很多。可以说,后缀数组比后缀树要更为实用。自从拜读了罗穗骞大牛的WC2009论文《后缀数组——处理字符串的有力工具》后,经过若干星期的努力(中间有因某些原因而缓下来),终于把论文上面的练习题全部完成了,现在写写自己对后缀数组的理解和感悟。在看本笔记时,请不要忘记了,这是笔记,而教材是《后缀数组——处理字符串的有力工 阅读全文
摘要:
http://www.byvoid.com/blog/lcs-suffix-array/http://www.cppblog.com/superKiki/archive/2010/10/29/131781.aspx?opt=admin[最长公共子串]最长公共子串(Longest Common Substring ,简称LCS)问题,是指求给定的一组字符串长度最大的共有的子串的问题。例如字符串”abcb”,”bca”,”acbc”的LCS就是”bc”。求多串的LCS,显然穷举法是极端低效的算法。改进一些的算法是用一个串的每个后缀对其他所有串进行部分匹配,用KMP算法,时间复杂度为O(N*L^2) 阅读全文
摘要:
http://churuimin425.blog.163.com/blog/static/34129877201141005542104/先转一个后缀数组的简单总结:后缀数组就是将字符串所有后缀排序后的数组,设字符串为S,令后缀Suffix(i)表示S[i..len(S)]。用两个数组记录所有后缀的排序结果:· Rank[i]记录Suffix(i)排序后的序号,即Suffix[i]在所有后缀中是第Rank[i]小的后缀· SA[i]记录第i位后缀的首字母位置,即Suffix[SA[i]]在所有后缀中是第i小的后缀然后就是怎么快速求所有后缀的顺序了,其中的关键是如何减少两个后 阅读全文
摘要:
http://chencb.ycool.com/post.1901840.html今天把后缀数组给看了下,评价就一句话:很好,很强大懒得写废话,直接把相关重点简单记录一下:后缀数组就是将字符串所有后缀排序后的数组,设字符串为S,令后缀Suffix(i)表示S[i..len(S)]。用两个数组记录所有后缀的排序结果:Rank[i]记录Suffix(i)排序后的序号,即Suffix[i]在所有后缀中是第Rank[i]小的后缀 SA[i]记录第i位后缀的首字母位置,即Suffix[SA[i]]在所有后缀中是第i小的后缀 然后就是怎么快速求所有后缀的顺序了,其中的关键是如何减少两个后缀比较的复杂度方法 阅读全文