• 源自 xyz32768 菜鸡的 FJ 省冬令营模拟赛题

  • 原题 CF1063F

Statement

  • 给定一个长度为 \(n\) 的字符串 \(s\),仅包含小写英文字母

  • 要从中从左往右选出若干段不相交的子串

  • 使得选出的这些串中,每个串都是上一个串的严格子串

  • 求最多能选出多少段

  • \(1\le n\le5\times10^5\)

Solution

  • 首先注意到一个性质:设选出的第一个子串长度为 \(len\),那么最优解选出的子串长度一定是 \(len,len-1,\dots,2,1\)

  • 于是从右往左 DP:\(f[i][j]\) 表示以 \(i\) 为首串的开头,是否存在选出 \(j\) 段的方案(也是首串的长度为 \(j\))

  • 这个 DP 是 \(O(n^2)\) 的

  • 我们还有一个性质:\(f[i][j]\) 是单调的。换句话说,如果存在选出 \(j\) 个串的方案就一定存在选出 \(j-1\) 个串的方案

  • 证明考虑第一个串 \(t\) ,如果选出的前 \(k\) 个串都是 \(t\) 的后缀,而第 \(k+1\) 个串是第 \(k\) 个串的前缀,那么我们可以把前 \(k\) 个串都删掉最后一个字符,第 \(k+1\) 个串直接扔掉,这样就构造出了一个选 \(j-1\) 个串的方案,特殊情况 \(k=j\) 时把所有串都删掉最后一个字符并把最后一个串(长度已经变成 \(0\))扔掉

  • 于是可以重新定义 \(f[i]\) 表示以 \(i\) 为开头最多选出多少个串

  • 根据上面的结论,可以二分 \(f[i]\),转化成判断是否存在 \(j\in[i+f[i]\dots n]\) 使得 \(\max(\text{lcp}(i,j),\text{lcp}(i+1,j))\ge f[i]-1\) 且 \(f[j]\ge f[i]-1\)

  • 易得建出 SA 之后,满足 \(\text{lcp}(i,j)\ge f[i]-1\) 的 \(rank_j\) 是一段区间,可以二分 + RMQ 求出这个区间之后,利用可持久化线段树求得该区间内的 \(f[j]\) 最大值,\(\text{lcp}(i+1,j)\) 同理

  • 这样的复杂度是 \(O(n\log^2n)\) 的

  • 注意到另一个性质:\(f[i+1]\ge f[i]-1\),证明类似上一个结论

  • 于是把 \(f[i]\) 设成 \(f[i+1]+1\) 之后不断检查当前的 \(f[i]\) 是否合法,如果不合法就一直 \(f[i]--\)

  • 易得 \(f[i]--\) 的次数之和不超过 \(O(n)\),所以总复杂度 \(O(n\log n)\)

  • 现场 \(O(n\log^2n)\) 甚至 \(O(n\sqrt n)\) 小常数过了,声名狼藉 QAQ

Code

  • 咕咕咕

[DP][SA][可持久化线段树]黑红兔的更多相关文章

  1. BZOJ5371[Pkusc2018]星际穿越——可持久化线段树+DP

    题目描述 有n个星球,它们的编号是1到n,它们坐落在同一个星系内,这个星系可以抽象为一条数轴,每个星球都是数轴上的一个点, 特别地,编号为i的星球的坐标是i. 一开始,由于科技上的原因,这n个星球的居 ...

  2. 洛谷P3994 Highway(树形DP+斜率优化+可持久化线段树/二分)

    有点类似NOI2014购票 首先有方程$f(i)=min\{f(j)+(dep_i-dep_j)*p_i+q_i\}$ 这个显然是可以斜率优化的... $\frac {f(j)-f(k)}{dep_j ...

  3. 【CF768G】The Winds of Winter 可持久化线段树 DFS序

    题目大意 给定一棵\(n\)个点的树,对于树上每个结点,将它删去,然后可以将得到的森林中任意一个点与其父亲断开并连接到另一颗树上,对每一个点求出森林中所有树\(size\)最大值的最小值. \(n\l ...

  4. 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)

    Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...

  5. BZOJ 4408: [Fjoi 2016]神秘数 可持久化线段树

    4408: [Fjoi 2016]神秘数 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4408 Description 一个可重复数字集 ...

  6. 2018-8-10 模拟赛T3(可持久化线段树)

    出题人说:正解离线按DFS序排序线段维护区间和 但是对于树上每个点都有一个区间和一个值,两个点之间求1~m的区间和,这不就是用可持久化线段树吗. 只不过这个线段树需要区间修改,不过不需要标记下传,询问 ...

  7. BZOJ 4556(后缀数组+主席树求前驱后继+二分||后缀数组+二分+可持久化线段树)

    换markdown写了.. 题意: 给你一个1e5的字符串,1e5组询问,求\([l_1,r_1]\)的所有子串与\([l_2,r_2]\)的lcp 思路: 首先可以发现答案是具有单调性的,我们考虑二 ...

  8. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  9. 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status ...

随机推荐

  1. <mvc:annotation-driven /><context:annotation-config/><context:component-scan/>

    <context:annotation-config/> 隐式地向 Spring容器注册AutowiredAnnotationBeanPostProcessor. RequiredAnno ...

  2. How to output the target message in dotnet build command line

    How can I output my target message when I using dotnet build in command line. I use command line to ...

  3. 【2016常州一中夏令营Day1】

    Problem 1. suffix给定一个单词,如果该单词以 er. ly 或者 ing 后缀结尾,则删除该后缀(题目保证删除后缀后的单词长度不为 0),否则不进行任何操作.Input输入一行,包含一 ...

  4. Docker应用容器引擎

    1.Docker概述 1.1.Docker简介 Docker 是一个开源的应用容器引擎,基于 Go 语言开发.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到 ...

  5. C++Review7_STL、容器、迭代器

    我之前的博文中有专门的5篇整理并介绍了STL的概念: STL1——整体介绍:https://www.cnblogs.com/grooovvve/p/10467794.html STL2——泛型编程(模 ...

  6. linux查看文件内容跳到文件底部和回到文件顶部的快捷键

    有时候需要查看一些日志文件,然后要从底部开始查看的话 可以按 shift+g  即可跳到文件底部 要返回文件顶部的时候 按 gg即可

  7. pyinstaller打包exe文件闪退的解决办法

    pyinstaller是python下目前能打包py文件为windows下的exe文件的一个非常友好易用的库!但是,小爬每次用pyinstaller打包时也总是遇到一些难题,有时网上搜了一圈,也没看到 ...

  8. 计算机专业如何高质量的走完大学四年?毕业成为Offer收割机

    前言:迷茫本就是青春该有的模样,但不要让未来的你讨厌现在的自己. "就要毕业了. 回头看自己所谓的大学生活, 我想哭,不是因为离别,而是因为什么都没学到. 我不知,简历该怎么写,若是以往我会 ...

  9. 利用log4net创建日志文件时过滤日志,这是坑还是?

    前言 网上貌似没有太多关于log4net过滤日志的资料,在研究过程中发现一点小问题,这里做下记录,希望对后续有用到的童鞋起到一丢丢帮助作用. log4net日志过滤 由于是在.NET Core中使用, ...

  10. 从零开始学asyncio(上)

    这篇文章主要是介绍生成器和IO多路复用机制, 算是学习asyncio需要的预备知识. 这个系列还有另外两篇文章: 从零开始学asyncio(中) 从零开始学asyncio(下) 一. 简单爬虫实例 首 ...