codeforces 873F(后缀数组)

题意

  给一个长度不超过200000的字符串s,假定有一个字符串a,这个字符串在s中出现次数是f(a),你需要让$|a|f(a)$最大。

  但是有一些位置是禁止的,即以该位置为结束位置的字符串不计数。

分析

  先不考虑禁止的位置

  那么可以求出后缀数组,枚举每一个height[i]作为|a|,向两边扩展,看看其在s中出现了多少次

  即找到最宽的[l,r],使得这个区间内最小的数就时height[i]

  这只需要两遍单调栈求出每个位置最靠近的小于它的数在哪里就行了

  于是该答案就是(r-l+2)*height[i],我们只需要找到答案最大的那个i就行了

  现在考虑禁止的位置

  “不能以该位结束”不是一个好用的条件,我们将其转换成“不能以该位为起点”,具体操作就是将字符串逆过来

  那么现在问题变得简单了,就是后缀数组中有一些位置被禁止了,我们把这些去掉就行了

  将剩余的height还要维护一下,因为两个位置中间的一些字符串消失了,所以这两个位置的lcp就发生了改变

  将剩余的n个height按“不考虑禁止位置”的操作进行求解即可

  时间复杂度$O(lenloglen)$

posted @ 2017-10-14 15:54  Chellyutaha  阅读(364)  评论(0编辑  收藏  举报