Ideas and Tricks Part III

58.$SAM$后缀自动机

东西挺多的

$SAM$中每一个节点都是一个$endpos$的等价类,节点与节点之间有字符的转移。构成的$SAM$是一个$DAG$,每一个在原串中本质不同的子串都唯一对应一条在$SAM$从初始节点出发的路径

可以发现对于一个节点的那些串,如果以长度升序排序后,前一个串是后一个串的后缀并且长度相差$1$,那么记最长的那一个串长度为$len(x)$,最短的一个串为$minlen(x)$,定义后缀链接为这个串最长一个串的$endpos$不和当前节点的$endpos$集合相同的节点,那么可以发现$len(link(x))=minlen(x)$,那么可以知道一个点所包含的本质不同子串个数就是$len(x)-len(link(x))$

首先是其构造,大概流程就是,在构造过程中记录前面一个前缀的节点,在后面添加一个字符的时候,新建一个节点$x$,先不断地扩展那些没有当前字符转移的节点,把这些节点的这种字符转移转移到当前节点$x$上,设第一个以前就有这种字符转移的节点为$p$,转移到的节点为$q$,如果$len(q)=len(p)+1$,那么直接把x的后缀链接设为$q$,否则克隆出一个新节点$cl$,令$len(cl)=len(p)+1$并且把所有小于其长度的节点重定向为$cl$,最后把$q$和$x$连接到$cl$上

可以发现$link(x)$形成了一个树形结构,那么这棵树就叫$parent$树,这棵树有很多性质

如果设那些前缀节点为终点,那么终点的$endpos$集合就是对应前缀的下标,那么对于任意一个节点来说,其$endpos$集合就是这个节点在$parent$树上子树所有终点构成的集合,那么可以方便通过一次$dfs$维护出所有节点$endpos$集合的大小,对于具体位置是哪些需要线段树合并来做

对于$parent$树上节点$x$,那么节点$x$到根路径上所有节点对应字符串恰好构成了所有$x$节点的后缀,相当于划分成了若干个区间,并且这些区间不交

那么在$parent$树上跳类似于$AC$自动机上建出的失配树上跳,只不过$SAM$相当于把所有子串建出了一个压缩版的$AC$自动机,那么这个东西可以做类似求两个串最长公共子串的问题,就是不断尝试去匹配,如果匹配失败就跳$parent$树,直到跳到空节点或者重新匹配上

《各 种 套 路》

59.最小圆覆盖

随机增量法,随机增量法就是对于前$i$个元素,处理出来符合条件的答案,然后试图去扩展到$i+1$个位置,需要保证原来的序列是打乱过的

最小圆覆盖就是这个的应用

考虑当前扩展到第$i$个点,设当前圆为$O$,那么去判断一下$i+1$是否在$O$内,如果在那么继续下一轮判断,如果不在,那么说明$i+1$这个点一定在新的覆盖圆上,因为这个圆需要向$i+1$这个点偏移,但又同时要满足原来的点在圆内,之前已经是最小覆盖圆,有至少一个点在圆上,如果$i+1$不在圆上,那么这个圆一定可以继续缩小

那么现在可以先把圆心设为这个点,半径为$0$,然后重新枚举之前的点,看是否在圆上,如果不在把圆设为过这两个点的圆,然后继续枚举前面的点,如果还不在圆上,把圆设为经过这三个点的圆,那么不断做下去就可以找到最小覆盖圆

每一次进入下一层循环的概率都是对应下标分之$3$,那么最终期望运行复杂度为$O(n)$

60.竞赛图求哈密顿回路

竞赛图就是无向完全图给每条边定一个方向,在任意一个竞赛图中一定存在一条哈密顿路径,在一个强连通的竞赛图中一定存在一条哈密顿回路

对于求哈密顿路径,可以如下的归纳构造

对于$1$到$i-1$的点,我们假设已经求得其哈密顿路径

如果当前i号点有连向$1$号点或者$i-1$号点连向了$i$号点,那么直接加入路径的首或者尾

否则记$x$号点为$i$第一个连向的节点,那么$[1,x)$中的节点,都是连向$i$的,那么可以构造$...(x-1)\rightarrow i\rightarrow x\rightarrow (x+1)...$的路径

求得哈密顿路径之后就可以构造哈密顿回路,那么首先找出最后一个有边连向第一个节点的点

考虑还是归纳构造,对于$1$到$i-1$的点已经构造出其哈密顿回路,也就是一个环

分两种情况讨论,首先如果没有边连向环中,那么先跳过这个节点,向下考虑

那么设第一个环中的节点$x$,使得$i$连向$x$,那么可以构造一个新环,就是将所有当前不在环中的点,依次插入$x$前面

61.对于询问区间定长设关键点

如果每一次询问的区间都是相同长度的,设长度都为$k$,那么可以在原序列上每隔$k$个点设一个关键点,然后在关键点上记录这个点向后$k$个的后缀信息,向前$k$个的前缀信息,那么每一次询问的区间一定覆盖了某一个关键点,那么利用关键点的信息即可

62.点减边

对于树上路径问题,如果考虑重链剖分的话,会把某一条路径拆成$log$个区间,对于那些某一条路径只计一次数的问题,如果对于每一个区间都进行一次统计的话会算重,那么可以考虑统计是区间内的点和边的数量

然后最后统计答案的时候相减,只会得到$0/1$的答案,还有注意在重链剖分的时候,需要将每一条链顶上面的那条轻边算到这条链上来

具体问题具体分析

63.解二维递推式

列出计数$DP$后,如果是二维形式,并且数据范围给的是$O(n)$级别的话,考虑去解其递归式

一般需要再列出一个方程,与之前的方程联立,得到一阶递推关系,然后去做

64.判断两个集合相同

可以对全集中元素随机分配一个值域较大$unsigned$ $long$ $long$的权值,然后对于一个集合,定义其权值为所有元素的异或和,如果两个集合的权值相同,那么可以判断这两个集合相同

65.拿出图的一棵 dfs 树,其中一条非树边和其两端点的树上路径所构成的环是这个图的环空间的基

66.DAG的点覆盖问题

精确覆盖指把用最少的路径,覆盖所有的节点,并且只覆盖一次,做法是拆点,拆成入点和出点,原图上的边仍然保留,但是由出点连向入点,求二分图最大匹配,答案为所有点数减去二分图最大匹配数

任意覆盖指用最少的路径,覆盖所有的节点,一个点可以被覆盖多次,在精确覆盖的做法上,增加出点到对应入点的反向inf边,然后跑最大流

 

首先做一遍二分图最大匹配,然后令左边点只能走非匹配边,右边的点只能走匹配边

 

二分图的一种最小点覆盖就是左侧的未访问点加上右侧的已访问点;二分图的一种最大独立集就是这些点的补集(对于二分图所有点全集)

67.Pollard Rho和Miller Robin

两个背板子的算法

首先是$Miller$ $Robin$素性测试,主要思想是利用费马小定理,随机选取若干数$a$,判断是否都有$a^{p-1}\equiv 1(\mod p)$成立,但是存在一类合数,使得这个条件成立,那么就会有概率出错

二次探测定理

$x^2\equiv 1(\mod p)$,$p$为奇质数,其解仅为$x\equiv 1$或$x\equiv p-1$

那么基于这个定理,可以改进上面的做法,首先将$p-1$分解成$d2^r$形式,先计算$a^d$,看其是否等于$1$,如果等于$1$之间判断条件为真,否则不断平方$r$次,如果中间出现$p-1$那么条件为真,否则为假

那么只要选取合适的a,一般选取$2,3,5,7,11,13,17,47$,$8$个质数判断即可

$Pollard$ $Rho$也是一个随机化算法,这是基于生日悖论,采用组合抽样法,来保证时间复杂度为$O(n^{frac{1}{4}})$

首先,如果我们直接像试除法去随机求因子,那么显然不行,那么考虑用gcd加速这个过程,因为只要$gcd$不为$1$,那么$gcd$一定是$n$的因数,那么就变成了一个子问题,递归下去求解,并且随机到$gcd$不为$1$的概率很高

注意这里选取的伪随机函数为$f(x)=x^2+c$,$c$为随机的一个常数,这个函数不断迭代分布还是比较均匀

倍增优化

注意到如果每一次都求一次$gcd$效率太低,$gcd$有些比较好的性质

$gcd(a,b)=gcd(ac\% b,b)$

那么我们每次固定一个上次倍增结束的数,然后不断累乘,只到某一个时间,与$n$求$gcd$,如果$>1$就直接返回

实践证明每$128$次求一次$gcd$,效果较好

需要注意的是,如果此处$n$为质数,那么会一直死循环下去,那么这时候就需要$Miller$ $Robin$来快速判断是否为质数

68.Undirected Vertex Geography

经典结论

描述:初始时在二分图的一个点上,两人轮流沿着边走,不允许重复访问节点,不能移动者输。

对于该问题有以下定理:起点$v$是先手必胜的,当且仅当它在所有最大匹配上。

必要性:若存在一个最大匹配$M$使得起点$v$不在其上,那么先手每次操作时,要么无路可走,要么走到了某个匹配点上(否则就找到了一条增广路)。于是,后手只要每次走到$M$中与该点匹配的点即可。
充分性:若$v$在所有最大匹配上:
我们有增广路定理的如下推论:对于无向图$G$和其任一最大匹配$M$,点$v$必定在最大匹配上,当且仅当对于$M$,在匹配上且不存在以$v$为一端的偶数长度交替路。
于是,我们取任意最大匹配$M$,现在先手把$v$移动到$M$中与之匹配的点上。那么由于不存在以$v$为一端的偶数长度交替路,移动后并删去点$v$的图中也不存在增广路,于是由增广路定理从$M$中删去先手走的边后仍然是最大匹配,且现在$v$在未匹配点上。于是情况和必要性证明中相同,先手必胜。

69.单位根反演

$[k|n]=\frac{1}{n}\sum\limits_{i=0}^{k-1}\omega_{k}^{in}$

如果$k|n$,那么$\omega_{k}^{in}=1$

否则等比数列求和

70.原根的一些性质

设原根为$g$,那么在模$p$意义下,对于$i\in[0,\varphi (p))$,$g^i$两两不同

那么对于某一个不是原根的数,假设可以写成$g^k$,其周期是$\frac{\varphi(p)}{gcd(k,\varphi(p))}$

那么检验原根的方法就是对于$\varphi(p)$每一个质因子$x$,检查$g^{\frac{\varphi (p)}{x}}$是否为$1$,如果全部条件都不满足,那么说明当前的$g$是原根

对于$p$为质数的情况,一定存在原根,并且在$[0,p)$范围内的数一定可以通过$g$的不同次方表示出来,求阶这个可以通过$BSGS$求出,如果对于多次询问,可以调整块长,保证平衡复杂度

upd:$BSGS$是朴素实现方式(不过$BSGS$可以求出$k$具体是多少,但下面这个方法只能求出周期)

注意到周期为$\frac{\varphi(p)}{gcd(k,\varphi(p))}$,考虑确定$gcd(k,\varphi(p))$,用$\varphi(p)$的质因子去试除$\varphi(p)$,找到最大的次数,使得得到的结果是$1$,那么这个除数就一定是$gcd(k,\varphi(p))$的一个因子

复杂度$O(log^2p)$

如果$p$不为质数,可能存在原根,如果存在原根,那么那些与$p$互质的数可以用原根表示出来

对于奇质数,奇质数的幂次,奇质数幂次的两倍,$2$的幂次是存在原根的,其他整数都不存在原根

对于奇质数的幂次$p^k$,设$g$为$p$的原根,那么$p^k$的原根为$g$或者$g+p$,对于$2p^k$,$g,g+p,g+p+p^k,g+p^k$为其原根

71.回滚莫队/莫队二次离线

回滚莫队

回滚莫队可以处理删除难以进行删除操作的问题,首先如果询问的两个端点在同一个块内,那么直接暴力计算,对于左端点同一个块内的右端点递增排序

考虑进行询问的时候,对于同一组内的询问,将两个指针移动到这个块的右端点,对于组内某一个询问,先将右边那个指针移动到对应位置,然后左移左指针,直到询问位置,求出答案后,将左指针移动所产生的修改撤回,移动回当前块的右端点

莫队二次离线

设处理单次询问的复杂度为$O(k)$,莫队二次离线可以将总复杂度,从$O(kn\sqrt(n))$,优化至$O(n\sqrt(n)+kn)$,前提条件是询问的内容是可差分的

考虑移动左右端点的贡献,记$f(x,[l,r])$表示$x$这个位置,对于区间$[l,r]$的贡献

移动左端点时$f(l,[l+1,r])=f(l,[1,r])-f(l,[1,l])$

移动右端点时$f(r,[l,r-1])=f(r,[1,r-1])-f(r,[1,l-1])$

那么就可以将询问拆开,再一次离线下来处理$f$,由于区间都是一个前缀,那么只要从前往后扫描序列就可以统计答案

具体来说注意到$f(l,[1,l])$和$f(r,[1,r-1])$这只有$n$种可能,直接计算,对于其他的,由于保证了另一个端点不动,那么只要把修改的区间加入对于另一个端点所处前缀的询问中去即可

细节较多,需要注意正负号的变化

72.Prufer序列

先记两个结论,对于$n$阶完全图,其生成树的方案数为$n^{n-2}$

对于$n$个节点的图,其中有$k$个联通块,每一联通块的大小为$s_i$,连成一颗树的方案数为$n^{k-2}\prod s_i$

这都是要有标号的情况下

73.Primal_Dual原始对偶算法(费用流)

比较适用于特殊图费用流,速度比$spfa$快很多,因为单次(多次)增广复杂度严格$O(nlogn)$,只要第一次求势能函数的时候,如果图有性质,可以避免$spfa$求最短路

首先是将求最短路的算法改成$dijkstra$,但是考虑到原来图上存在负权边,直接跑$dijkstra$不行

考虑给每一条权赋势能函数

这里势能函数$h(x)=dis(s,x)$,$dis(s,x)$表示原图上源点$s$到$x$的最短路

然后利用三角不等式$h(u)+w_{u,v}\geq h(v)$

移项$w_{u,v}+h(u)-h(v)\geq 0$,那么将新的边权赋为$w_{u,v}+h(u)-h(v)$,就保证了图上边权非负

可以证明,原图上最短路径所经过的点和新图上最短路径所经过的点是相同的

且$dis'(s,x)=dis(s,x)-h(x)$,增广也很方便

由于跑网络流的时候图是在动态变化的,那么也要动态维护势能函数

结论是$h'(x)=h(x)+dis'(s,x)$

证明略

74.平行求和法

容易忘记

$\sum\limits_{k\leq n}\binom{r+k}{k}=\binom{n+r+1}{n}$

$\sum\limits_{k\leq n}k\binom{r+k}{k}=(r+1)\binom{n+r+1}{n-1}$

$\sum\limits_{k\leq n}k^2\binom{r+k}{k}=(r+1)\binom{n+r+1}{n-1}+(r+1)(r+2)\binom{n+r+1}{n-2}$

可以通过画杨辉三角直观的看出

75.有标号计数中将标号分配到集合中的不重计数

比如当前问题的规模是$n$(标号都是从$1$到$n$),现在要加入一个大小为$m$的集合,给其分配标号

那么考虑$n+m$号元素强制是在这个集合中,那么剩下$m-1$个元素要在$n+m-1$中选择

方案就是$\binom{n+m-1}{m-1}$

76.无向图dfs树不存在横叉边,只存在返祖边 

77.$\sum\limits_{i=1}^{n} a_i\leq R$求方案数

可以像线性规划一样加入一个新的变量$B$

令$B+\sum\limits_{i=1}^{n} a_i= R$

然后直接插板法$\binom{R+n}{n}$

如果正常做就是平行求和法

posted @ 2020-12-21 23:12  SevenDawns  阅读(171)  评论(2编辑  收藏  举报
浏览器标题切换
浏览器标题切换end