ZROI 暑期高端峰会 A班 Day3 字符串
FBI Warning:本文含有大量人类的本质之一
后缀树
反正后缀树就是反串的后缀自动机的 Parent 树,就不管了。
然而 SAM 也忘了
好的假装自己会吧——dls
后缀自动机
大概记得,不管了。
回文树/回文自动机
大概记得,不管了。
[HEOI/TJOI2016]字符串
给一个字符串 \(s\),\(m\) 次询问,每次问 \(s[a\dots b]\) 的所有子串和 \(s[c\dots d]\) 的 LCP 长度最大值。
\(|s|,m\le 10^5\)
就是求 \(s[a\dots b]\) 所有后缀和 \(s[c\dots d]\) LCP 长度最大值。
就是求 \(s[a\dots b]\) 所有后缀和 \(suf_c\) LCP 长度最大值,再跟 \(d-c+1\) 取个 \(\min\)。
就是求 \(suf_i(a\le i\le b)\) 和 \(suf_c\) LCP 长度和 \(b-i+1\) 取 \(\min\) 的最大值,再跟 \(d-c+1\) 取个 \(\min\)。
应该可以主席树搞一搞。
我就用 SA,用你妹的 SAM,SA 多好想
NOI2016 失恋十联测 D5T2
一个字符串 \(S\) 一开始空的,\(q\) 次操作,每次回到第 \(x\) 个操作之后,然后在末尾加上 \(c_i\)。
每次操作后问最小循环节长度。强制在线。
\(q\le 10^5\),字符集大小 \(\le 10^5\)
KMP 是均摊的,飞了。
但是有个办法:
为什么会飞?因为一次操作可能会往回跳很多次,那我重复它很多次他就没了。
那么可以有个办法避免重复跳:
\(trans[x][c]\) 表示在第 \(x\) 个字符后接个 \(c\),最后会跳到哪。
如果 \(s[x+1]=c\),那么 \(trans[x][c]=x\)。否则 \(trans[x][c]=trans[next[x]][c]\)。
那么发现 \(trans[x]\) 和 \(trans[next[x]]\) 只差了一个位置,用可持久化线段树就能保证复杂度了。
还有一个办法:
当 \(next[x]\le \frac{x}{2}\) 时,直接跳。
当 \(next[x]>\frac{x}{2}\) 时,把 \(x\) 膜个 \(x-next[x]\) 就好了。因为循环节长度是 \(x-next[x]\),所以如果 \(x\) 不行,那么 \(x-k(x-next[x])\) 也不行。
复杂度就是严格的 \(\log\) 了。
BZOJ 4310
长 \(n\) 的字符串 \(S\),请将 \(S\) 分成不超过 \(k\) 段,使得一段的所有子串中,字典序最大的最小。
\(|S|\le 10^5,k\le 15\)。
求出 SA,肯定要把 rk 最大的几个切开,二分最大的串保留的前缀长度。
(在搞组队于是掉线了)
咕了。
NOI赛前集训2019 D6T3
上面的加强版。
咕了。
Fim1
给字符串 \(S\),维护字符串序列 \(T\)。
\(m\) 次操作,要么是在 \(T\) 后面加个 \(T[x]+c\),要么是在 \(T\) 后面加个 \(c+T[x]\),要么问 \(T[x]\) 在 \(S[l,r]\) 的出现次数。
全是 \(10^5\)。
首先如果不是子串,肯定是 \(0\)。
否则对 \(S\) 建个 SAM,维护每个 \(T[x]\) 是在哪个点上,询问就变成求子树中 \(right\) 集合有多少个在 \([l+len-1,r]\)。
这个线段树合并一波解决。
修改操作,第一种就是按转移边走,第二种就是先判目前节点行不行,不行就选一个 parent 树上的儿子。
???
区间本质不同子串个数
区间本质不同回文串个数
第一问:离线,枚举右端点,维护 \(ans[l]\) 表示此时左端点在 \(l\) 的答案。
\(r\) 往右移一个时,会多出一堆后缀。其实就是 SAM 的 parent 树上 \(last\) 到根的链。
先考虑暴力跳。一个点对应一个区间的后缀,对不同的 \(l\) 有不同的贡献,随便线段树一下。具体要记 \(tag[i]\) 表示 \(i\) 号点上次在哪里出现,然后是跟 \(tag[i]\) 有关的。
但是不能暴力。
发现要把 \(tag[i]\) 赋成 \(r\)。
然后……就用 LCT 了???smg???
(好像是因为可以把 \(tag\) 一样一段的看成 LCT 上的实链,操作实际上就是把所有链并成一条实链,同时这样一段的 \(right\) 集合也是连续的一段,所以可以看成一个点操作)
第二问,咕了。
CF700E
一个字符串对另一个字符串是好的,当且仅当这个字符串在另一个字符串里出现了至少两次。
给字符串 \(S_1\),求最大的 \(k\) 使得存在字符串序列 \(S_i(1\le i\le k)\) 使得 \(S_{i+1}\) 对 \(S_i\) 是好的。
首先 \(S_{i+1}\) 一定是 \(S_i\) 的后缀。
为什么?
咕了。
???
给字符串 \(S\),定义 \(plcp(x,y)\) 表示后缀 \(x\) 和后缀 \(y\) 的最长公共回文前缀。
\(F(x)=\sum\limits_{i=0}^x\sum\limits_{j=0}^xplcp(i,j)\)
\(q\) 次操作,每次在 \(S\) 末尾加一个字符,输出 \(F(|S|)\)。强制在线。
\(|S|,q\le 10^5\)。
实际上就是回文树上两点 LCA 的深度。
每次加入一个点,求它和每个点的 LCA 深度之和。
然后……传说可以 LCT????
……
其实树剖也行。
???
求一个字符串的所有子串中,任选 2 个,计算 \(\sum[|A|+|B|-2lcp(A,B)\le L]\)。
\(n\le 10^5\)
虽然忘了 SAM 了,但是感受一波,感觉就是建后缀自动机,然后 parent 树上 \(\sum\limits_{u,v}(len[u]-len[fa[u]])(len[v]-len[fa[v]])(dis(u,v)\le L)\)。
感觉是个裸的淀粉质啊……
事实证明感受错了。是 \(\sum\limits_{u,v}[dis(u,v)\le L]\),而且因为每个节点代表了一堆串,所以会再多一些奇怪的系数。
然后不会树分。连串随机的边分都不会。
然后就……死了。
咕了。
Deep Purple
长 \(n\) 的字符串 \(S\),\(q\) 次询问,每次询问 \(S[l\dots r]\) 的 LBorder。
\(n,q\le 10^5\)
我们要找到一个最小的 \(i\) 使得 \(l\le i\le r\le i+lcp(i,l)-1\)。答案就是 \(r-i+1\)。
离线,从左往右扫,依次加入询问,依次加入 \(l\) 和 \(i\),注意到对于 \(l\) 我们只要求最小的 \(i\),所以加入
咕了。
NOI2019赛前集训 D6T2
怎么这么眼熟……
咕了。
Lyndon 串
对于字符串 \(s\),如果 \(s\) 的最小后缀是他本身,那么它是个 Lyndon 串。
等价于它是所有循环移位中字典序最小的一个。
若 \(u,v\) 是 Lyndon 串,那么 \(uv\) 是 Lyndon 串当且仅当 \(u<v\)。
我们可以把任意串 \(v\) 分解成 \(v=v_1v_2v_3\dots v_m\)。其中 \(v_i\) 是 Lyndon 串且 \(v_i\ge v_{i+1}\)。这被称为 Lyndon 分解。
怎么求?初始时 \(n\) 段,每段一个字符,然后如果 \(v_i<v_{i+1}\) 合并。
有唯一性:
设 \(pre(s,i)\) 表示串 \(s\) 中 \(s[1…i]\) 所代表的前缀
若有两种方案,取第一次不同的位置,设 \(|s_i|>|s'_i|\)
令 \(s_i=s'_is'_{i+1}…s'_kpre(s_{k+1},l)\)
反证法。根据定义,\(s_i<pre(s'_{k+1},l)\le s'_{k+1}\le s'_i<s_i\)
矛盾。
Duval 算法
\(O(n)\) 求 Lyndon 分解。
引理:若字符串 \(v\) 和字符 \(c\) 满足 \(vc\) 是某个 Lyndon 串的前缀,那么对于 \(d>c\) 有 \(vd\) 是 Lyndon 串。
维护三个变量 \(i,j,k\),
(之前广州集训的时候,这个也刚好生病错过去了……)
咕了。
NOI2019 赛前集训 D6T3
又 tm 这么眼熟……
咕了。
ZROI 暑期高端峰会 A班 Day3 字符串的更多相关文章
- ZROI 暑期高端峰会 A班 Day3 图论
最短路 NOI2019 D2T1 弹跳 KD 树 线段树套set -> 线段树套并查集? POI2014/2015 ??? \(n\) 个点 \(m\) 条边 DAG.求删掉每个点后 \(1\) ...
- ZROI 暑期高端峰会 A班 Day2 线性代数
高斯消元 很普及组,不讲了 当主元没有逆的时候可以辗转相除. 如果也没有带余数除法--没救了 逆矩阵 我们定义矩阵 \(A\) 的逆矩阵为 \(A^{-1}\),满足 \(AA^{-1}=A^{-1} ...
- ZROI 暑期高端峰会 A班 Day4 生成函数
一般生成函数 很普及组,不讲了 生成函数是一种形式幂级数,也就是我们只关心系数,不关心未知数具体的值. 比如 \(\sum\limits_{i\ge 0}x^i=\frac{1}{1-x}\).虽然只 ...
- ZROI 暑期高端峰会 A班 Day4 树上数据结构
FBI Warning:本文含有大量人类的本质之一. 你经历过绝望吗? [ZJOI2007]捉迷藏 询问树上最远黑点对. 动态边分治可以比点分治少一个 \(\log\). bzoj3730 咕了. [ ...
- ZROI 暑期高端峰会 A班 Day1 组合计数
AGC036F Square Constriants 一定有 \(l_i<p_i\le r_i\). 考虑朴素容斥,枚举每个数是 \(\le l_i\) 还是 \(\le r_i\).对于 \( ...
- ZROI 暑期高端峰会 A班 Day1 序列数据结构
FBI Warning:本文包含大量人类的本质之一 CF643G 维护一个序列,可以区间赋值,求区间中出现超过 \(p\%\) 的数. 允许输出不对的数,允许重复输出,但是所有对的数都一定要输出.而且 ...
- ZROI 暑期高端峰会 A班 Day5 杂题选讲
CF469E \(n\) 个需要表示的数,请使用最少的 \(2^k\) 或 \(-2^k\) 表示出所有需要表示的数.输出方案. \(n\le 10^5,|a_i|\le 10^5\). 首先每个数肯 ...
- ZROI 暑期高端峰会 A班 Day5 计算几何
内积(点积) 很普及组,不讲了. \[(a,b)^2\le(a,a)(b,b)\] 外积(叉积) 也很普及组,不讲了. 旋转 对于矩阵 \(\begin{bmatrix}\cos\theta\\\si ...
- ZROI 暑期高端峰会 A班 Day6 离线问题
FBI Warning:本文含有大量人类本质之一. 动态联通问题 允许离线. 模板,不讲了. 归并排序 %@)(#&%)++%($@)%!#(&%)(&@))) 主定理 U^( ...
随机推荐
- sql server锁表、查询被锁表、解锁被锁表的相关语句
MSSQL(SQL Server)在我的印象中很容易锁表,大致原因就是你在一个窗口中执行的DML语句没有提交,然后又打开了一个窗口对相同的表进行CRUD操作,这样就会导致锁表.锁表是一种保持数据一致性 ...
- 【mysql】windows7 安装mysql5.7 解压缩版 + windows7 安装mysql5.7报错 计算机丢失了MSVCR120.dll解决方法
1.下载mysql 5.7的zip版解压缩的安装包 在mysql官网:http://dev.mysql.com/downloads/mysql/ 2.解压到本地任意目录,并创建一个mysql_data ...
- 【linux】linux磁盘空间 目录查看清理 和 文件查看清理
=========================大目录排查============================= 一.首先查看磁盘挂载,磁盘空间使用情况 1.进入根路径 cd / 2.查看磁盘挂 ...
- Lock+Condition实现机制
前言:大部分多线程同步场景,在功能和性能层面,synchronized可以满足,少部分场景Lock可以满足,dubbo的源码也符合这个比例,需要使用到Condition的场景极少,整个dubbo源码中 ...
- [转]ASP.NET Core Web API 最佳实践指南
原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 转自 介绍# 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但 ...
- MarkDown 常用语法规则
> # 标题 # 标题1:h1的效果 ## 标题2:h2的效果 ### 标题3:h3的效果 #### 标题4:h4的效果 ##### 标题5:h5的效果 ###### 标题6:h6的效果 ### ...
- kkpager 实现ajax分页查询
前台分页数据,适合数据少量的时候,因为分页的数据是从后台获取的,大数据的话不建议使用 现看前台代码: @{ Layout = null; } <!DOCTYPE html> <htm ...
- 浅谈Vue.js2.0核心思想
Vue.js是一个提供MVVM数据双向绑定的库,专注于UI层面,核心思想是:数据驱动.组件系统. 数据驱动: Vue.js数据观测原理在技术实现上,利用的是ES5Object.defineProper ...
- Android viewPager+fragment实现滑页效果
先上图,手指在手机向左或者向右滑就可以实现相应的页面切换. 先看activity_main.xml文件,非常简单,主要是三个标题TextView和viewpager <?xml version= ...
- 使用gacutil把COM组件注册到全局缓存GAC中
我们在编写软件的时候,有时候需要调用COM组件,那就需要注册了,注册有两种,一种是使用regasm 在程序运行的时候注册,参考“pb调用C#编写的DLL类库“,不过受路径的限制.还有一种注册方式,使用 ...