CF666
A.Reberland Linguistics
注意到最多有 \(2n\) 个串,所以直接枚举所有串的合法性。对于 \(s[i]\) 开头的子串,因为“根”字符串长度不限所以不用管前缀的限制,所以判断其后缀可否用多个“后缀”字符串拼接起来即可。判断是好判断的,直接倒序枚举 \(i\) 并更新判断数组即可。因为要求相邻的“后缀”字符串不能相同,所以会有个小分讨
B.World Tour
注意到 \(n\leqslant 3000\)、“最短路”、“每条边的权值相同”等词,肯定要先 BFS 预处理出所有点对之间的最短路距离。
枚举路径 \(a\rightarrow b\rightarrow c\rightarrow d\) 时,可以先分别处理出 \(a\rightarrow b\) 和 \(c\rightarrow d\) 的最值,再枚举 \(c,d\) 拼接成完整的路径。但是这个要求四个节点不能相同 就很麻烦,若重了就需要使用次大值,如果又又重了就要换成第三大值。仍是一个分讨
CF 数据好水
C.Codeword
我们称长度为 \(L\) 的字符串为串 \(t\)。若 \(t\) 的多个子序列都和 \(s\) 相同,那么我们只计入其位置最靠前的相同的子序列(不然会算重)。现在考虑 \(s\) 的 \(n\) 个字符在 \(t\) 串中的位置,显然,字符 \(i\) 与字符 \(i+1\) 之间的所有字符应该都不等于 \(s_{i+1}\),即这段区间每个元素有 \(25\) 种选择;\(s_n\) 后的位置没有限制,就仍是 \(26\) 种选择。假设有 \(k\) 个位置没有限制,那么最终的答案即为
组合数里面包含了三个变量,不利于计算,所以式子变形为
不管怎样这个式子都优化不了。我们令 \(f(L,n)\) 等于上面这个式子,注意到这个 \(f(L,n)\) 有递推式 \(f(L,n)=26 f(L-1,n)+25^{L-n} \binom{L-1}{n-1}\),而数据范围下本质不同的 \(n\) 只有约 \(\sqrt{V}\) 个,所以离线直接做即可
D.Chain Reaction
正着考虑感觉情况很乱,考虑正方形的四个端点向外扩散的情况。端点扩散的轨迹显然和正方形四条边延长而成的直线重合,换言之,原图上四个点正确延展的轨迹应和最终正方形的四条直线重合,因为只有四个点直接枚举四条直线即可。因为四条边可能需要去重,所以还需要分讨一下
-
若是两条横线、两条竖线,那么判断一下直线交点所连成的四边形是否为正方形即可,最终答案只需暴力枚举
-
若是两条横线、一条竖线,那么有一条横线上一定存在两个点,两种情况分别判断计算即可
-
若是两条横线、零条竖线,不考虑三点一线的不合法方案,此时正方形的边长已经确定,二分端点移动距离上界判断合法范围内是否存在正确的边长即可。
-
一条横线一条竖线肯定不合法
横线比竖线少的情况只需旋转九十度计算。
E.Forensic Examination
广义 SAM + 可持久化线段树合并
考虑只有一个模式串 \(T\),这样只需建立一个 SAM 后跑出串 \(S'\) 的节点 \(u\),直接输出 \(u\) 的 \(endpos\) 集合大小即可。在这之中的问题就是题目不保证 \(\sum |S'|\),即不能每次都在 SAM 上跑一遍 \(S'\)。可以将 \(S_{[l..r]}\) 子串看作前缀的后缀,先跑出每个前缀在 SAM 上的匹配结点与长度,再倍增至 \(S'\) 的等价类结点上。
多个模式串建立广义 SAM 即可,查询可以用可持久化线段树合并求出每个串 \(T_i\) 在该节点的 \(endpos\) 集合大小后区间查询最大值。