A A A
- 大概就是考场思路,当时觉得细节太多没写完
考虑从后向前 d p dp dp 出当前的合法长度,从前向后维护可能成为答案的串的集合,需要根据这个 d p dp dp 判一下合法性,注意到若一个串不是另一个的前缀一定可以删除一个
串的集合是一个串和它的若干个前缀,用一个串和一个集合可以表示一个状态
考虑当前的串拼接进去,需要把不是前缀的串给筛掉,发现只需要求当前串串头和答案串每个位置的 l c p lcp lcp,用 Z − a l g o r i t h m Z-algorithm Z−algorithm 解决
反思了一下为啥我的做法细节麻人,就是我插入串的时候要弹前面的,弹后面的
而题解求出了一个最小值(字典序相同长度大的小),所以只需要把集合中的点拿去更最小值比就可以快速更新, C o d e Code Code
B B B
- 考虑限制是不经过两条直线(
n
n
n 维空间),即
f
i
f_i
fi 为第一次走到第一条直线不经过两条直线的方案数
g i g_i gi 为第二条,记总方案数为 a i , b i , c i a_i,b_i,c_i ai,bi,ci 表示从 f f f 走到 f f f 上,从 f f f 走到 g g g,以及从 g g g 走到 f f f 上,进行容斥,容易写成生成函数的形式:
F = A − A F − C G G = B − A G − B F F=A-AF-CG\\ G=B-AG-BF F=A−AF−CGG=B−AG−BF
答案是 G G G 的末项,注意其中 A 0 = 0 A_0=0 A0=0,解出来多项式求逆即可, C o d e Code Code
C C C
- z x y zxy zxy 的神仙做法,考虑对每个点求出它为一个端点的答案,枚举另一个端点,统计外面路径的个数,注意到可以 d s u o n t r e e dsu\ on\ tree dsu on tree 预处理子树内部或子树外部的方案数,点分,要加上链上挂的子树内部的路径条数,拆一下项就可以快速维护, C o d e Code Code