容易发现 L 是可以二分的。
接着考虑二分如何 check。
比较容易思考的思路是 DP,设 fi 表示前 i 个字符的熟悉子串最长的长度之和。设当前二分的是 L,那么 fi=max{fi−1,j∈[i−maxleni,i−L]maxfj+(i−j)}。其中 maxleni 表示以 i 结尾的最长的在字符串中出现过的字符串的长度。
也就是说,我们可以枚举每一个 j 进行转移,因为有 [i−maxleni,i−L] 的限制,每个从 j+1 到 i 的字符串一定是在标准作文库中出现过的,转移即可。
maxleni 可以建出 SAM 后用求最长公共子串的做法维护。
可以获得一个 O(mn2logn) 的做法。
容易发现 DP 有决策单调性,单调队列维护即可。