这是一个标算与瞎搞的故事…
传送门
题解
蒟蒻我人生的第一道1次过样例并AC的黑题。(然而写的并不是标算,这题貌似也没有达到黑题的难度)
这题的标算是后缀数组,然鹅蒟蒻我选择了瞎搞QwQ。
此题瞎搞的关键点在于找出题目中隐藏的单调性。(大雾)
首先,如果先考虑长度为$1$的子串,再考虑长度为$2$的,长度为$3$的…那么分别一共有$n$个、$n-1$个、$n-2$个。
并不好搞。
所以倒着来处理。(汗
长度为$n$的子串可以由$1$开头、长度为$n-2$的子串可以由2开头…每次可能的开头增加一个。
并且其中有一定的单调性:对于合法的开头$i,j$,如果当前$i$比$j$优,那么之后$j$永远不可能比$i$优。
所以构造一个单调栈$stk[]$,每次直接把新增的合法开头扔进栈顶,然后不断比较当前长度下$stk[top]$和$stk[top-1]$。如果此时$stk[top]$不比$stk[top-1]$优,直接弹掉它,维护栈的单调性。
维护操作结束后,栈顶就是当前最优解。
但是还有一个关键问题没有解决:如何快速比较两个较长字符串的大小?
既然原字符串是静态的,那么可以通过Hash+二分找出两个字符串的最长相同前缀,然后比较下一位即可。
瞎搞完成 ,总时间复杂度为$\Theta(n\log n)$。
然后…
ZS:嗯哼?后缀数组的题让你Hash+二分过了?看我拍一宿造数据卡掉你!!!
蒟蒻我:老师我写了双Hash!!!
ZS:嗯哼!喂?是中国人民解放军国防科技大学吗?麻烦你们把天河二号借我用一宿…
然后就没有然后了QwQ…
代码
1 |
|