646546

image
因为这个 \(h\) 求的是所有子串过于生草
所以扫描线对每个右端点维护所有左端点的 \(g\)

image
说人话:
对于以 \(i\) 为右端点的匹配串,因为所有串的长度之和 \(<m\)
所以不同的左端点只有根号种
所以 \(\overline{g}\) 的不同的变化区间也只有根号种

image
人家的式子是 \(\max(\frac{g(s[l:r])}{r-l+1})\),然后我们扫描线对每个 \(i\) 维护所有 \(g[j:i]\)
那带着这么个分母怎么分数规划呢?
给每个字母都赋权!这样选一个区间的价值就恰好是 \(g(s[l:r])-mid*(r-l+1)\)
那现在线段树每个位置维护的就是上面这个式子
对每个 \(i\) 查存不存在非负值就可以了

image
刚才 \(l\leqslant 50\),所以距离 \(i\leqslant l\) 的部分可以每次暴力重求一遍
现在 \(l\) 没有限制了怎么办呢?
考虑「距离 \(i\leqslant l\) 的部分每次暴力重求一遍」实际上在干什么
因为距离 \(i\leqslant l\) 的部分可能仍在匹配状态当中
所以不能直接当做完全失配了用 \(g(s[i-l:i+1])-g(s[i-l:i])\) 算新加入的贡献
那根据题解所说,我们可以直接在 AC 自动机上维护仍在匹配中的位置的答案
已经失配的用差量算答案

image
先考虑已经失配的部分:用 $premax

posted @ 2022-02-25 16:46  Administrator-09  阅读(5)  评论(0编辑  收藏  举报