[DP][SA][可持久化线段树]黑红兔
源自 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][可持久化线段树]黑红兔的更多相关文章
- BZOJ5371[Pkusc2018]星际穿越——可持久化线段树+DP
题目描述 有n个星球,它们的编号是1到n,它们坐落在同一个星系内,这个星系可以抽象为一条数轴,每个星球都是数轴上的一个点, 特别地,编号为i的星球的坐标是i. 一开始,由于科技上的原因,这n个星球的居 ...
- 洛谷P3994 Highway(树形DP+斜率优化+可持久化线段树/二分)
有点类似NOI2014购票 首先有方程$f(i)=min\{f(j)+(dep_i-dep_j)*p_i+q_i\}$ 这个显然是可以斜率优化的... $\frac {f(j)-f(k)}{dep_j ...
- 【CF768G】The Winds of Winter 可持久化线段树 DFS序
题目大意 给定一棵\(n\)个点的树,对于树上每个结点,将它删去,然后可以将得到的森林中任意一个点与其父亲断开并连接到另一颗树上,对每一个点求出森林中所有树\(size\)最大值的最小值. \(n\l ...
- 计蒜客 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 ...
- BZOJ 4408: [Fjoi 2016]神秘数 可持久化线段树
4408: [Fjoi 2016]神秘数 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4408 Description 一个可重复数字集 ...
- 2018-8-10 模拟赛T3(可持久化线段树)
出题人说:正解离线按DFS序排序线段维护区间和 但是对于树上每个点都有一个区间和一个值,两个点之间求1~m的区间和,这不就是用可持久化线段树吗. 只不过这个线段树需要区间修改,不过不需要标记下传,询问 ...
- BZOJ 4556(后缀数组+主席树求前驱后继+二分||后缀数组+二分+可持久化线段树)
换markdown写了.. 题意: 给你一个1e5的字符串,1e5组询问,求\([l_1,r_1]\)的所有子串与\([l_2,r_2]\)的lcp 思路: 首先可以发现答案是具有单调性的,我们考虑二 ...
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
- 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
随机推荐
- H3C端口状态迁移
- linux /proc 接口
无论何时一个硬件中断到达处理器, 一个内部的计数器递增, 提供了一个方法来检查设备 是否如希望地工作. 报告的中断显示在 /proc/interrupts. 下面的快照取自一个双处理 器 Pentiu ...
- 2018-10-23-使用-Pandoc-把-Markdown-转-Docx
title author date CreateTime categories 使用 Pandoc 把 Markdown 转 Docx lindexi 2018-10-23 10:56:18 +080 ...
- 前端——BOM与DOM
目录 前戏 window对象 window的子对象 navigator对象(了解即可) screen对象(了解即可) history对象(了解即可) location对象 弹出框 计时相关 DOM H ...
- Kafka学习笔记(四)—— API使用
Kafka学习笔记(四)-- API使用 1.Producer API 1.1 消息发送流程 Kafka的Producer发送消息采用的是异步发送的方式.在消息发送的过程中,涉及到了两个线程--mai ...
- 【一起学源码-微服务】Nexflix Eureka 源码十一:EurekaServer自我保护机制竟然有这么多Bug?
前言 前情回顾 上一讲主要讲了服务下线,已经注册中心自动感知宕机的服务. 其实上一讲已经包含了很多EurekaServer自我保护的代码,其中还发现了1.7.x(1.9.x)包含的一些bug,但这些问 ...
- InterpreterPattern(解释器模式)-----Java/.Net
解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式.这种模式实现了一个表达式接口,该接口解释一个特定的上下文.这种模式被用在 SQL 解析.符号处 ...
- 程序员初学者参考 ---懂得基础语法后如何做一个自己的case?
对于很多人来说,我懂java语法,甚至面向对象的特性啦这些都是有了解的,但我就是不会做项目,其实项目真有那么难吗? 对于基础不牢固的人来说,我还不会这个基础点,那个还没学呢,你让我做个项目,我保证做不 ...
- Springboot 添加热部署
Pom 文件 添加依赖 添加插件 修改idea ,启动自动部署 <!--配置热部署--> <dependency> <groupId>org.springframe ...
- 用实例理解设计模式——代理模式(Python版)
代理模式:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式分为: 静态代理 动态代 ...