CF1995D Cases 题解
题目传送器
更爽的阅读体验
CF 2300
前言
我菜了,不会 SOSDP,是学习其他题解的做法。
题意
自己去看翻译。
做法
SOSDP 好题。
因为每个子串长度不超过 ,所以每 个位就会有至少一个位是子串的末尾,共有 个这样的区间,所以充要条件就是末尾字符构成的集合与 个区间构成的集合都有交。
形象化来说,, 为每个子串末尾字符组成的集合,,求 。
考虑 SOSDP,先预处理出每个 ,再使用子集 DP 转移。由于要记录当前状态是否与 有交,时间和空间复杂度均为为 ,即使用 bitset 优化,空间依旧开不下,所以考虑正难则反。
上述方法空间较大的主要原因是难以维护当前状态与哪些 有交,因为这个状态就已经是 的。考虑维护当前状态是否与任意一个 都无交,对于每个状态就只要 的空间了,对于和每个 都不是无交的状态,即和每个 都有交的状态,就可以成为 。
具体实现就是预处理出 ,则 的任意一个子集都与 无交,暴力枚举子集需要 ,使用 SOSDP 转移将复杂度将为 ,到最后 dp 值为 的状态就代表与任意 都有交,可以成为 ,更新答案即可。