闲话 Day15
这两天的题完全改不动。
两个星期之后就 NOI 了,和现在完全没有的水平形成了鲜明的对比。
前两天又去找了点神仙 DP 做了做。
结论是两年白学。
题解都看不懂。
为什么闲话 Day13 看的人那么多。
是因为我引流了吗。。。
然而这个是学术闲话。
鉴于没有题材那就整点普及内容吧。
本来挺喜欢 SAM 的。
单字符串问题可以直接做,多字符串还可以跑广义 SAM。
然而,前两天去广义 SAM 题解区翻了翻,发现广义 SAM 的复杂度是 \(O(n|S|)\)。
。。。。。
突然就感觉很不优秀了。
所以,今天提供一个好写的 \(O(n)\) 复杂度小常数建普通 SAM 的方法。
啥,你说平常写的 SAM 就是 \(O(n)\) 的?
显然是 \(O(n \log |S|)\) 吧。
而且时空常数还挺大的。
显而易见的,瓶颈在于快速查找 DAG 边。
所以容易想到哈希表。
然而直接 unordered_map
显然不现实。
我们可以使用类似于 vector
的倍增重构思想。
具体的,每个节点维护初度 \(D\) 和目前 Hash Table 长度 \(len\)。
如果发现插入一条边之后 \(D > \frac{len}{2}\),就将 \(len\) 翻倍,整体重构。
复杂度考虑对于某个节点,如果最后长度为 \(len\),则重构总代价 \(T(n) = T(\frac{n}{2}) + O(n) = O(n)\)。
为了缩小空间常数可以使用线性探查解决碰撞。
至于扩大 Hash Table 长度,朴素实现可以直接用 vector
。
然而这并不符合我们常数小的要求。
可以直接开一个静态数组,然后每次在上面新开一段分配内存。
容易发现空间复杂度还是线性的。分析同时间。
实际效果是跑得飞快。
即使在 26 的字符集大小下也能显现出来优势。
甚至空间比直接开 26 长度数组小了一半。
提交记录。
目前在板子题上跑得比这个快的只有实现良好的 SA-IS 了。
关于这东西的用处。
显然,根据经典结论,反串 SAM 是正串后缀树。
而后缀树上 DFS 可以得到后缀树组。
所以我们可以直接借助 SAM 完成任意字符集大小的后缀排序。
复杂度严格线性,常数大抵是小于 DC3 的。
而且理解难度小(假如会 SAM 的话。就不用去学什么 SA-IS 了)
然后发现没有东西可写了。
炒冷饭!
只要没有出现在闲话里面就可以再写一遍!
普及组选手也能现场口胡出来的可并堆!
考虑我们现在要维护若干集合。
支持新建集合、插入元素、查询最大最小值、删除最大最小值、集合合并。
也就是 永远亭计数 这个题。
显而易见的是我们可以对一个集合维护两个左偏树来完成这个东西。
然而空间常数其实还挺大的。
所以我们来整一点可以同时维护最大最小值的可并堆。
首先考虑我们去维护有序数组。
因为,有序数组归并是 \(O(n)\) 的诶,不带 \(\log\)。
当我们去合并集合 \(A,B\) 的时候,直接归并。
如果 \(|A|,|B|\) 差不多复杂度自然是正确的,也就是启发式合并了。
然而如果 \(|A|\) 远大于 \(|B|\) 呢。
好了我不会了,那就不合并了。
直接维护两个并列的有序数组好了。
然后我们发现,这东西复杂度对了。
考虑把规定描述的严格一点。
对于每一个集合,我们维护若干个有序数组。
如果存在两个有序数组 \(A, B\),满足 \(|A| > |B|\) 且 \(|A| < 2|B|\),那么我们就将 \(A,B\) 归并。
那么容易发现,对于一个集合,其内部最多只有 \(O(\log n)\) 个有序数组。
考虑我们还需要查询最大最小值。
暴扫显然是 \(O(\log n)\) 的。
然而我们可以直接对于每一个堆,记录下来这两个值。
这样查询就是 \(O(1)\) 的了,把复杂度丢给修改即可。
考虑插入/删除。
插入自不必多说。可并堆的插入都是直接合并的。
删除的话直接扫 \(O(\log n)\) 个有序数组,对于每个有序数组,维护一个 \(begin\) 一个 \(end\)。
删前面/后面就直接改即可。
当然,删完之后需要注意一下合并的问题。
各项复杂度和左偏树完全相同。
但是空间常数极小。
(如果实现良好的话。事实证明很难实现的很好)
另外,可以在支持合并的前提下,\(O(\log^2 n)\) 支持查询集合内 \(< k\) 的数的个数。
当然,如果牺牲一点点常数的话,可以做到 \(O(\log n)\)。
做法简单所以不放了。和强制在线 CDQ 那个一样。
之前认为我还算是喜欢学术一类的东西吧。
然而真的是这样吗。
在 東方Project 里面盘点一下喜欢的角色吧。
首先自然是蓬莱山辉夜。
如果再说的话可以算上早苗、铃仙、文。
倒是各有特点,不太好说有什么共性。
然而这四个里面人气最低的是辉夜 ?!
根据官方设定,早苗的能力是创造奇迹程度的能力。
在仔细考虑之后,可能我所认为的喜欢学术只是单纯的喜欢奇迹罢了。
引用 Day9:
这是什么,有意思,研究一下。
这是什么,好优秀,实现一下。
由于 OI 水平很低所以看什么东西都觉得很神奇。
所以在探究的过程中会带来很多新鲜感。
和小小的 OI 震撼。
所以,可能我所喜欢的只是见证奇迹和创造奇迹罢了。
对于知识本身,我不好说。
这么看的话,关于学术这件事还需要慎重考虑一下。
学术中几年没有任何进展是非常常见的事。
如果新鲜感被消磨干净了那就非常危险了。
总是有一些不太好的感觉。
虽然没有任何理由,但是总是感觉现在开始攒钱是有必要的。
当然,可能攒钱没有用。攒点什么我不好说。
在庞大的社会经济面前个人积蓄啥都不是。
希望只是杞人忧天吧。
闲话 Day16 可能会加一点隐私内容?
看心情。
目前为止比较了解我的人不多。
多留一点隐私空间是好的,但是。。。
倒时候看心情写。写多少算多少了。
容易发现近几期闲话攻击性小了很多了。
大抵都是一些和日常生活贴近的东西。
其中一个原因是这些天确实没时间思考那些离生活很远的东西。
闲话一类的,一般都是当时想到了当时写。
当然,对于大多数人阅读闲话的习惯来看,那些东西写了也没啥用。
简单看一看过去了,可能没过几分钟就忘掉了。
回顾之前的各种闲话。
发现我在措辞上面其实还是比较的保守的。
一般都会加上各种限定词,不会把话说的非常绝对。
这个习惯哪里来的,不清楚。
而且平常说话也会稍微带点。只不过很难注意到。
也许会显得很不严谨?
再写两行。
凑够 200 行就跑路。
诶好了够了。闲话结束。