首先注意到题目的限制可以方便的利用图论模型来刻画。翻转字符串,将前缀限制变为后缀限制。串 A 是串 B 的后缀在 SAM 上体现为 B 在 A 的子树中,所以先建出 fail 树,再将所有父亲连向儿子。对于支配 (A,B),相当于串 B 所在结点向 A 所在结点连边。但在相同结点,只有长度短的向长度长的可以连边。所以拆点,对单点长度离散化一下,建边即可。
接下来就是模板的最长路径长度。注意存在环的时候长度为 \infty。时间复杂度 O(Tn)。
Code 3.67KB
Day1 C 骗分过样例
这道题真的有人做吗
Day2 A 皮配
简化题意来自 Mirach。
有 c 个豆荚,共 n 颗豆子,每颗豆子都有自己的重量,现在需要将给豆子设定为 (黄色/绿色,圆粒/皱粒),要求满足以下条件:
给定这四种性状的阀值 C_0,C_1,D_0,D_1,要求为这种性状的豆子重量和不能超过该阀值。
与此同时,这 n 颗豆子中存在 k 颗顽皮豆,顽皮豆都有自己的想法,比如拒绝成为 (黄圆/黄皱/绿圆/绿皱)。
给定一棵 n 个点的树,你需要找到 k 个连通块,使得存在一个点在每一个连通块当中,而且所有点距离它不超过 L。L\le n\le 10^6,k\le 10。
初始变换
注意到确定这 k 个集合后,剩下的所有合法点一定能够构成一个连通块。对这个连通块进行 “点数-边数” 的容斥。考虑换根 DP,设 f_{x,i} 为 x 子树内包含 x,且距离 x 不超过 i 的连通块数量(包括空块),g_{x,i} 表示在 x 以及父亲子树范围内,包含 x 且距离 x 不超过 i 的连通块数量(必选 x)。
那么对于每个点,答案就是 ((f_{x,L}-1)\times g_{x,L})^k。对于每条边,在儿子处进行计算,答案为 ((f_{x,L-1}-1)\times g_{x,L})^k。接下来就需要着手去解决 f 和 g 的计算。有下列公式:
但本题时间限制紧,只能使用 常数级别数据结构 解决问题。正难则反,后缀乘可以看成一次全局乘和一次前缀乘逆元。注意到前缀长度是 len_y,支持暴力操作。加个全局乘标记 mul 可以解决问题。在实际代码中,出于将实际值改写成序列值的需要,还得维护标记的逆元 imul。
这个时候问题又来了:如果 f_{y,len_y}=0\bmod p 怎么办?这个时候就相当于对一段后缀清零。记录下来需要清零的后缀 lim=len_y+2。不过这里还有个问题,那就是清零点后续可能还会有新值加入(比如 f 数组最后的 +1)。这个时候稍稍修改下定义,把 “清零点” 变成 “等值点”,再存储下等值点对应的权值 val 即可。