摘要:
有些时候,后缀自动机并不能解决某些问题,或者解决很麻烦。这时就有各种神奇的字符串算法了。 manacher算法用来O(|S|)地求出字符串S的最长的回文子串的长度。这是怎么做到的呢? 并不对劲的暴力选手在刚见到求字符串S的最长的回文串的长度这个问题时,第一反应就是枚举每一个位置为回文串的对称轴,再暴 阅读全文
摘要:
对于带修改的区间求和能做到O(n log n)预处理,O(log n)查询;而不带修改的可以做到O(n)预处理,O(1)查询。那么不带修改的区间最值能做到O(1)查询吗? 区间最值有这样一个性质:对于一段区间的两个子区间,如果它们覆盖了整个区间(可以有重叠部分),那么这两段区间各自的最大(或最小)值 阅读全文
摘要:
为了反驳隔壁很对劲的太刀流,并不对劲的片手流将与之针锋相对。 很对劲的斜堆、左偏树简明教程-> 它们是可并堆的两种实现方式。 (还是假装二叉堆只包括小根堆。) 斜堆的缺点在于,每次合并的堆大小不同,无条件交换左右子树可能遇到某些坑孙子的数据,复杂度会变得玄学。 左偏树是在斜堆上有所改进的。根据斜堆的 阅读全文
摘要:
为了反驳隔壁很对劲的太刀流,并不对劲的片手流将与之针锋相对。 很对劲的斜堆、左偏树简明教程-> 它们是可并堆的两种实现方式。 (假装二叉堆只包括小根堆。) 二叉堆该如何合并?先想一种暴力的。 现在有根的键值较小的二叉堆A,键值较大的二叉堆B。 在合并后,A的根肯定还是根。若A的左、右子树都不为空的话 阅读全文
该文被密码保护。 阅读全文
摘要:
顾名思义,就是对于每次操作,将用新的节点替代本应修改的节点。由于每次单点修改只会改log n个节点,所以动态开点可以做到空间是q log n + n的。 这是一棵对劲的线段树,要修改这一串红色的点。普通的线段树是直接修改。 对于可持久化线段树而言,则是新建一些节点,替换掉应该修改的节点。原来的节点不 阅读全文
摘要:
并不对劲的片手流在为很对劲的太刀流调树剖时发现线段树写错了的时候整个人都不好了,决定反驳隔壁很对劲的太刀流并与之针锋相对。 很对劲的太刀流在这里-> 听上去像是熟练剖粪。 一棵树可以看成是很多条链组成的。那么把这些链拼成一条线,在树上进行区间操作时就可以将每次操作的部分拆成很多段连续的部分。这样就可 阅读全文
摘要:
俗话说的好,心中有党,常数极小。 1、循环中加寄存器优化for(register int i;i<=n;i++){} 好像在开O2时这个没什么用。 2、函数前inline int f(int x){} 当调用函数本身的时间长度比执行函数的更长时效果会更显著。配合read()、write()使用更佳。 阅读全文
摘要:
先膜一波宽神Orz%%%%% 拿到这题的第一反应就是:暴力啊!感觉神奇的钟点并没有什么性质,可能卡常能过吧……所以就写了一个O(22^3*59^3)的暴力。本来想打表,但是发现代码长度有限制,写不下。写完后发现,总共只有127034种神奇的钟点,所以当k特别大时,直接输出-1就可以了。如果数据纯随机 阅读全文
摘要:
题意是求一个字符串每个长度的子串出现次数最多的那个出现了多少次,也就是求每个到根的最长路的right集合最大值 。 先建后缀自动机,然后将每个前缀所在的集合的初值设为1,因为所有前缀的right集合肯定不相同,而且它们包含了所有位置。 接下来按到根的最长距离从大到小排序,将right集合累加到par 阅读全文