后缀数组
后缀数组就是把一个文本串的所有后缀按字典序从小到大排放的数组。详细介绍见刘汝佳《算法竞赛训练指南》。
AC自动机可以处理多模板的文本匹配问题,而后缀数组也可以处理多模板的文本匹配问题。那么它们有什么区别呢?
AC自动机需要事先知道所有的模板,然后对于一个(在线输入的)文本串进行多模板匹配,也就是说模板一定要全部事先知道,需要匹配...
分类:
编程语言 时间:
2015-03-31 00:53:25
阅读次数:
208
AC自动机
直接学AC自动机比较难理解,强烈建议先学完KMP和字典树并进行一定的练习后,对于失配指针和字典树构造有一定理解后再来学AC自动机的内容。有关AC自动机的详细介绍可见刘汝佳的《算法竞赛入门经典训练指南》P214.
给你一个字典(包含n个不重复的单词),然后给你一串连续的字符串文本(长为len),问你该文本里面的哪些位置正好出现了字典中的某一个或某几个单词?输出这些位...
分类:
其他好文 时间:
2015-03-29 23:50:15
阅读次数:
535
RMQ(Range MinimumQuery)问题
有关RMQ的详细介绍可见刘汝佳《算法竞赛入门经典训练指南》P197页
RMQ问题可以解决对于一个整数数组(当然也可以是其他可比较大小的元素类型)的任意区间[L, R]查询最值时,以O(1)时间复杂度回答询问。其实它就是一种数据压缩的思想。
RMQ能在经过O(nlogn)的时间预处理后,做...
分类:
其他好文 时间:
2015-03-15 16:57:14
阅读次数:
148
树状数组
关于树状数组的详细介绍可见刘汝佳《算法竞赛入门经典:训练指南》
对于一个n元素的数组A[n],可执行如下操作:
Add(I, d):让A[i]变成A[i]+d。
Query(L, R):返回A[L]+A[L+1]+…+A[R]。
注意:树状数组只能计算A[1]开始的和,A[0]这个元素是不能用的。上面操作复杂度都是...
分类:
编程语言 时间:
2015-03-14 21:44:37
阅读次数:
206
题意:有n个人排队,要求每个人不能排在自己父亲的前面(如果有的话),求所有的排队方案数模1e9+7的值。分析:《训练指南》上分析得挺清楚的,把公式贴一下吧:设f(i)为以i为根节点的子树的排列方法,s(i)表示以i为根的子树的节点总数。f(i) = f(c1)f(c2)...f(ck)×(s(i)-...
分类:
其他好文 时间:
2015-03-02 23:40:15
阅读次数:
196
训练指南24页的题 真是醉了 以为死循环了 原来是循环套的太多了 出一组样例 500S+ 递归尽量减少嵌套循环 会死 我的复杂度34*14*13*12*11*10*9*8*7*6*5*4*3*2*1 提前脑子不好用啊!!!
特别注意以后回溯千万别忘记调用函数后还要把变量改回来#include
#include
#include...
分类:
其他好文 时间:
2015-02-26 16:40:46
阅读次数:
192
《训练指南》中的第二种算法,其实本质上就是个背包。d[i][j]表示,在子树的节点数最大为i的情况下,j个节点的解。当之前的i-1,i-2,....0的结果都已知的时候,d[i][j]自然可根据下式求解:
d[i][j]=sum{C(f(i)+p-1,p)*d[i-1][j-p*i] | p*i
其中f(i)表示恰好有i个节点的子树的数量。而C(f(i)+p-1,p)则表示有p棵i节点子树形成...
分类:
Web程序 时间:
2015-02-23 16:45:39
阅读次数:
203
这道题居然提交了十次才过....期间小问题不断。思路的话基本是《训练指南》里面来的,不过有几个小问题需要注意一下。第一,当K在大于100的情况下,就直接输出0就可以了。因为a,b不超过2^31,可以估算出a,b最多十位十进制数,那么每位最大为9,所以各个数字之和是不可能超过100的,那么个数字之和为模K为0的条件是永远不可能到达的。
还有一点是,当剩余数字d=0时,当且仅当m1和m2...
分类:
其他好文 时间:
2015-02-22 17:20:16
阅读次数:
160
依旧是《训练指南》上的一道例题。思路大致相同,即设有一个序列S(i),S(i+1),S(i+2)...S(j),d[i,j]为所求的解。当S(i)==S(k),id[i,j]+=d[i+1,k-1]*d[k,j]直到k>j。最后的d[i,j]就是序列S(i)..S(j)的解。那么题目最终的解即为d[0,n-1],n为序列的长度。
不过,在具体的解法上,我和书上的做法不一样。书上使用的是递归,而我...
分类:
其他好文 时间:
2015-02-21 17:45:42
阅读次数:
160
依旧是《训练指南》上的一道例题。书上讲的比较抽象,下面就把解法具体一下。因为涉及到父子关系,因此自然而然可以将n个节点构造成一棵树,最后将形成一个森林。接下来将使用递归的手法。设f(i)是以节点i为树根的子树,节点i有儿子c1,c2,c3....cj共j棵子树。s[i]为树根为i的子树包含的节点数。如果分别先给各个子树内部排序,那么毫无疑问,
共有f(c1)*f(c2)*f(c3)....*f(...
分类:
其他好文 时间:
2015-02-19 18:40:24
阅读次数:
267