后缀自动机:
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的多下放一层