ABC312Ex 题解
blog。这玩意有空心橙????写篇题解祭一下速杀 *2400(
什么时候,两个串可能会冲突?答案是他们有公共最小循环节。于是用 KMP 求出每个串的最小循环节。
存在一个暴力:将所有最小循环节相同的串放到一起 query,对于一个循环节长度为 \(r\) 的串,遍历 \(r,2r,3r,\cdots,x\cdot r\) 直到 \(x\cdot r\) 没有被使用过,答案即为 \(x\)。这样显然是平方的。
考虑对原串完全相同的串记忆化。即:若有 \(S_1=S_2\) 且 \(S_1\) 的答案为 \(x\),处理 \(S_2\) 时直接从 \((x+1)\) 开始枚举。
正确性显然,复杂度呢?下文记 \(S=\sum|s_i|\)。
注意到原问题维护了 \(O(n)\) 个集合,显然它弱于 \(1\) 个集合的问题:
Problem:维护集合,每次 find 最小的、不在集合内的、能够整除 \(r\) 的数,并把它 insert 进集合。
一个潜在条件是 \(\sum r\le S\)。并且容易证明,集合最大数不会超过 \(\sum r\)。
对相同的 \(r\) 记忆化后,一个 \(r\) 最多只会遍历 \(O(\dfrac Sr)\) 次,于是总复杂度 \(O(\sum\limits_{r=1}^S \dfrac Sr)=O(S\log S)\)。
code,时间复杂度 \(O(S\log^2S)\)。另一篇题解使用了 hash-table 做到了 \(O(S\log S)\)。