首页 > 其他分享 >[SA记录] P6095 [JSOI2015]串分割

[SA记录] P6095 [JSOI2015]串分割

时间:2023-02-11 11:22:26浏览次数:52  
标签:二分 分割 JSOI2015 后缀 最大值 P6095 枚举 长度 SA

题目

首先考虑到题目要求分割出的 $k$ 个数中最大值尽量小,所以我们分割出的 $k$ 个数的长度尽量相同。我们令 $m=\lceil\frac{n}{k}\rceil$,那么这 $k$ 个数中,有的长度为 $m-1$ (如果 $k|n$ 的话就没有长度为 $m-1$ 的)有的长度为 $m$ ,并且最大值的长度一定等于 $m$  。

接下来,比较简单的想法是直接二分最大值等于多少,然后会发现不会写check()(也有一定可能是我太弱了)。所以考虑先破环为链,然后对该数字串做后缀排序,并将二分最大值改成二分以最大值为开始的后缀的排名(也就是说二分出来的那个后缀的长度为 $m$ 的前缀是最大值)。

现在只需考虑如何检验刚刚二分出来的后缀的长度为 $m$ 的前缀作为最大值是否满足题目要求。那么就枚举破环为链后的数字串分割出的第一个数字的开始位置(因为原串实际上是一个环,哪一个分割出的数字作为第一个其实不重要所以这一个枚举不需要从头到尾枚举,只需枚举 $1~m$ 即可 )枚举分割出的第 $i$ 个数字长度应该是 $m$ 还是 $m-1$ 。如果第 $i$ 个数字长度为 $m$ 时后缀排名都不会超过 刚刚二分出的后缀排名那么这个数字长度就取 $m$ ,不然长度取 $m-1$ 。最后看这 $k$ 个数字总长度不小于 $n$ 的话刚刚二分出的后缀排名就是可以的了。

Code

 

标签:二分,分割,JSOI2015,后缀,最大值,P6095,枚举,长度,SA
From: https://www.cnblogs.com/nebula-xy/p/17110848.html

相关文章