专题整理

后缀自动机:

A: 生成魔咒

每个节点有的串的个数就是len[i] - len[fa[i]]
所以每次加入字符的时候顺便统计就可以了



B: 弦论

建出后缀自动机

求出size表示当前节点字符串出现次数 然后对size求和 表示当前节点及其子树出现个数

然后递归求解 如果不走当前转移边 那么k直接-=sum

类似线段树求k大的思想



C: 公共串

很套路的一类问题

设T个串 字符集大小为k 每个串长度为n

这里给出三种做法

第一种:
当串的数量不多时 可以直接建出n个后缀自动机

都从根开始跑 如果所有自动机都有当前转移边才转移

每次转移和答案取Max

第二种:
以一个建出后缀自动机

别的在上面跑

求出每个节点作为结束 最多能有多长

T个串每个节点互相取min

最后统计所有节点 取max得解

第三种:

广义后缀自动机

每个点记录siz 表示在哪几个串中出现

然后上传的时候启发式合并map



D:工艺

把字符串复制一倍 然后直接在后缀自动机上跑

取出字典序最小的一个 进入 接着跑就可以了



E:差异

发现这个式子很像树上的距离 其实也就是树上的距离

把字符串倒过来 然后发现一个很好的性质

就是两个点的lcp化成了 LCA的深度

然后重点是求两点距离

边权不是1 而是len[i] - len[fa[i]]

按每个点统计贡献就可以了 树上DP

size[v] * (n - size[v]) * (len[v] - len[u]) 也就是当前点的贡献



F:品酒大会

一个显然的性质是 k相似 那么一定也k-1相似 k-2相似

所以可以分别求出i相似的 然后做个前缀和就可以了

发现这里和差异很像 只是边权化成了1 直接求就可以了

关于第二问 记录下来当前子树的Mx和Mn

然后每次更新父亲的答案



G:Sandy的卡片

转化题意: 数组改成差分数组 一样跑LCS就可以了



LCT

A:Cave 洞穴勘测

LCT维护联通性 动态加边删边



B:树的维护

记录lazy 表示修改区间

需要注意的地方是

pushdown的时候不能只修改自己

所以要多向下传递一个

否则rotate的时候会挂掉 因为pushup的时候 儿子的信息可能是错的



C:水管局长数据加强版

发现断边不容易处理

所以时光倒流 改为处理加边

发现如果加边之前 x,y不在同一联通块

直接加边即可

否则断掉x,y中边权最大的边 加边



D: GERALD07加强版

LCT套主席树

挺好的思路

对联通块个数有贡献的加边 充要条件是 x,y在加边前不属于同一个联通块

所以可以预处理出所有加边

nxt[i]记录下当前次加边 如果产生环 在环中最早的加边是什么时候

然后对于l到r的询问

也就是求在l到r的区间内 有多少位置的nxt的值小于l

这些加边是有意义的

主席树维护一下就可以了



F:LCA

很久之前就做过的题了

dep[lca(x,y)]可以转化为 从x到根节点所有权值+1 求从y到根节点权值和

然后LCT就可以随便维护了



G:染色

对于每个点记录lco ,rco , col, cnt

表示区间左端点颜色 右端点颜色 本身颜色 区间颜色段个数

pushup的时候 判断下左儿子右端点颜色 右儿子左端点颜色 以及本身颜色 处理cnt就好了

注意pushdown的多下放一层

posted @ 2020-12-27 20:35  HISKrrr  阅读(101)  评论(0编辑  收藏  举报