zoukankan      html  css  js  c++  java
  • 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)$

  • 相关阅读:
    移动 ProgramDataPackage Cache 文件夹
    Visual Studio 2017
    微信小程序 View:flex 布局
    echarts 模拟迁徙
    树莓派3 Windows 10 IoT Core
    Lumia 830 win10m 启用触摸按键
    青岛旅游
    <孤独者生存(小小辛巴投资手记)>读书笔记
    Python.Unix和Linux系统管理指南
    <低风险投资之路>读书笔记
  • 原文地址:https://www.cnblogs.com/wmrv587/p/7667609.html
Copyright © 2011-2022 走看看