https://vjudge.net/contest/579844
A
source: Gym104420D
位运算构造,超过一定范围必定无解。 打表找规律
B
source: Gym104420E
考虑每个数只被拿一次意味着只会走成一个区间并拿走区间里的数,预处理左/右走出去再回来的最大值,前后缀优化dp。
C
source: Gym100548G
一个串 \(s\) 本质不同的回文子串最多只有 \(O(|s|)\) 个。
在两个串上建PAM求交,也可以马拉车+哈希模拟回文树的结构。
PAM求交:相同结构的树可以放到一起dfs,类似线段树合并/trie合并。
D
source: HDU4117
朴素dp为之前的串中为当前串子串的dp值max,扔到ACAM上就是fail树上到根的路径max,因为路径max不好做,改成子树max单点查询就好做了。
关于压空间:考虑 \(26<2^5\),将小写字母压成 \(5\) 位二进制数只在 \(5\) 的倍数位上操作,因此总串长 \(\times 5\) 但 儿子数 \(\div 13\) 大大压缩了空间。
E
source: HDU4787
ACAM显然不能支持快速的插入,但可以支持 \(O(n)\) 的重构。
两种做法:
- 根号重构:建两个ACAM,小机机每次插入重构一次,总串长满根号就全部放到大机机里重构大机机,小机机每次重构都是 \(O(\sqrt n)\),大机机只会重构 \(O(\sqrt n)\) 次。每次询问将两个ACAM上的答案加起来,复杂度 \(O(1)\)。
- 二进制分组:建 \(O(logn)\) 个ACAM,插入时从总串长最小的开始,当前总串长超过两倍就全部和前一个一起重构,考虑每个串只会被重构到 \(logn\) 次,总复杂度 \(O(nlogn)\)。