[JSOI2019]节日庆典

题意

洛谷

做法

先来说个暴力
从前往后枚举\(k=(1,2,...,n)\)
我们维护这样一个集合\(P_k\),集合内任意两个元素\(i,j(i<j)\),满足\(\text{lcp}(S[i:],S[j:])\ge k-j+1\),即有可能在\(\ge k\)的前缀中成为答案的集合

考虑从\(P_{k-1}\)过渡到\(P_k\)

  • 初始化\(P_{k}=P_{k-1}\cup \{k\}\)
  • 不断加入元素,比较与末尾元素的大小关系,修正集合

最后,对\(P_k\)中选出最小的即可,比较两元素\(i,j\),发现需要做的事均为比较某前缀与后缀的\(\text{lcp}\),可以通过\(\text{exkmp}\)\(O(1)\)计算

这样总复杂度是\(O(\sum\limits_{i=1}^n |P_i|)\)

考虑优化

考虑\(i<j\),比较不出大小,即\(lcp(S_i,S_j)\ge k-j+1\)
\(k-j+1\ge j-i\),即前缀\(k\)形如\(ABBC\)\(C\)\(B\)的前缀,\(i\)在第一个\(B\)开头,\(j\)在第二个\(B\)开头
\(S_i=BBCA\)\(S_j=BCAB\)\(S_{j+(j-i)}=CABB\)

  • \(BCA\le CAB\),有\(S_i\le S_j\le S_{2i-j}\)
  • \(BCA\ge CAB\),有\(S_i\ge S_j\ge S_{2i-j}\)
    因此若出现\(k-j+1\ge j-i\),则可以丢弃\(\{j\}\),故有\(j-i>k-j+1\),容易得到\(|P_k|\)\(O(logk)\)

所以总复杂度为\(O(nlogn)\)

posted @ 2020-04-11 21:14  Grice  阅读(176)  评论(0编辑  收藏  举报