『2019Summer Algorithms』

<更新提示>

<第一次更新>
一个暑假两次集训,感觉学了好多好多的东西,也挖了好多好多的坑,于是就决定写一篇关于算法的总结,用于熟悉新算法,也留下一点对新算法的理解。


<正文>

AC自动机

简单的说就是在\(trie\)树上实现\(KMP\),用于多模式串的匹配。

\(AC\)自动机的理解就在于\(fail\)指针,\(fail\)指针是实现多模式串匹配的关键。每次匹配失败后,\(fail\)指针会指向一个当前匹配串的最长真后缀,数次跳跃后,就能实现对文本串的一段在\(trie\)树进行所有可能的匹配。

而对于\(fail\)指针的求解,用\(bfs\)实现。\(AC\)自动机的时间复杂度是线性的(一般情况下)。

好像\(AC\)自动机还有一个拓扑建图优化,还没有学。

博客这篇,模板题这里

manachar算法

\(manacher\)算法用于求解一个字符串每一个位置的最长回文字串。

这个算法其实和\(KMP\)的思想差不多,只要用已知信息去推后面的信息就可以了。具体地,可以记录当前最大的回文右端点,然后画一下对称图,就可以推了,不是很难。

博客这篇,模板题这里,可以看\(HL\ Day4\)的课件。

ExKMP算法

\(KMP\)算法的拓展,又称\(z-algorithm\),用于求解以下问题:

给你两个字符串\(s,t\),长度分别为\(n,m\),请输出\(s\)的每一个后缀与t的最长公共前缀。

思想和\(KMP\)\(manacher\)都是一样的,就是从前往后推。由于相邻两个位置的答案有很大一部分是重复匹配的,所以可以根据上一次的答案考虑,需要分两种情况讨论。

不是很好写,好像下标还只能从\(0\)开始,从\(1\)开始会非常别扭。

博客这篇,模板题这里

块状树

把分块思想放在树上,就是树分块。

\(dfs\)遍历树,把连续遍历到的一段节点加在一个块里。然后就可以对树子树信息进行维护了。

还是和分块一样,块内设法直接维护,边角暴力。这样进行分块是可以支持修改和动态加点的,但是不是稳定算法,会被菊花图卡掉。

模板题这里

树同构

也可以说是树哈希算法,主要用于判定树的形态。

一般来说用的是最小表示法,像树形\(dp\)一样,先获取每个子树的\(hash\)值,然后组合成一个新的序列,再\(hash\)一个值返回即可。

当树是无根树的时候,还要先找以下重心作为根,当然也要考虑双重心的情况。

模板题这里

类欧几里得算法

好像和欧几里得算法没什么关系,是用来计算整除求和式的。

主要思想就是分类,然后分治,比欧几里得算法稍微复杂一点,就是推公式吧,套路还是拆一下求和式,下取整。

模板题这里

整体分治

简单的说就是对于多个询问同时进行二分答案,像二分答案一样判定询问的真实答案位于哪一侧,然后对询问进行分类,就变成一个分治算法了。

真正理解点在于询问分类,这是分治算法的核心,得到的子问题是独立的。这样就可以理解为什么修改操作也能参与分类了。

代码上就是要想好用什么数据结构来维护贡献,然后注意操作的时间顺序就可以了。

模板题:K大数查询Dynamic Rankings,可以看蓝书。

线段树分治

\(cdq\)分治一样,是时间分治的一种。

就是对时间建线段树,然后把一个时间段内存在的操作打在线段树的\(log\)个区间节点上。而对于一个时间点的询问,就对应了线段树的一个叶节点,所以只需将询问挂在叶节点上即可。

在线段树上处理完所有操作和询问后,对整棵线段树\(dfs\)一次,向下访问时依次处理掉节点上的操作,到达叶节点就回答掉询问,向上回溯时就撤销掉操作。

别的都很简单啊,想好用什么数据结构维护操作(要支持撤销)即可。

模板题这里,博客这篇


<后记>

猜你喜欢

转载自www.cnblogs.com/Parsnip/p/11367604.html