[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)\)的