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 字符串的更多相关文章

  1. ZROI 暑期高端峰会 A班 Day3 图论

    最短路 NOI2019 D2T1 弹跳 KD 树 线段树套set -> 线段树套并查集? POI2014/2015 ??? \(n\) 个点 \(m\) 条边 DAG.求删掉每个点后 \(1\) ...

  2. ZROI 暑期高端峰会 A班 Day2 线性代数

    高斯消元 很普及组,不讲了 当主元没有逆的时候可以辗转相除. 如果也没有带余数除法--没救了 逆矩阵 我们定义矩阵 \(A\) 的逆矩阵为 \(A^{-1}\),满足 \(AA^{-1}=A^{-1} ...

  3. ZROI 暑期高端峰会 A班 Day4 生成函数

    一般生成函数 很普及组,不讲了 生成函数是一种形式幂级数,也就是我们只关心系数,不关心未知数具体的值. 比如 \(\sum\limits_{i\ge 0}x^i=\frac{1}{1-x}\).虽然只 ...

  4. ZROI 暑期高端峰会 A班 Day4 树上数据结构

    FBI Warning:本文含有大量人类的本质之一. 你经历过绝望吗? [ZJOI2007]捉迷藏 询问树上最远黑点对. 动态边分治可以比点分治少一个 \(\log\). bzoj3730 咕了. [ ...

  5. ZROI 暑期高端峰会 A班 Day1 组合计数

    AGC036F Square Constriants 一定有 \(l_i<p_i\le r_i\). 考虑朴素容斥,枚举每个数是 \(\le l_i\) 还是 \(\le r_i\).对于 \( ...

  6. ZROI 暑期高端峰会 A班 Day1 序列数据结构

    FBI Warning:本文包含大量人类的本质之一 CF643G 维护一个序列,可以区间赋值,求区间中出现超过 \(p\%\) 的数. 允许输出不对的数,允许重复输出,但是所有对的数都一定要输出.而且 ...

  7. ZROI 暑期高端峰会 A班 Day5 杂题选讲

    CF469E \(n\) 个需要表示的数,请使用最少的 \(2^k\) 或 \(-2^k\) 表示出所有需要表示的数.输出方案. \(n\le 10^5,|a_i|\le 10^5\). 首先每个数肯 ...

  8. ZROI 暑期高端峰会 A班 Day5 计算几何

    内积(点积) 很普及组,不讲了. \[(a,b)^2\le(a,a)(b,b)\] 外积(叉积) 也很普及组,不讲了. 旋转 对于矩阵 \(\begin{bmatrix}\cos\theta\\\si ...

  9. ZROI 暑期高端峰会 A班 Day6 离线问题

    FBI Warning:本文含有大量人类本质之一. 动态联通问题 允许离线. 模板,不讲了. 归并排序 %@)(#&%)++%($@)%!#(&%)(&@))) 主定理 U^( ...

随机推荐

  1. OPTIONS预检请求

    OPTIONS预检请求 背景:像后台发送一个post请求,出错,错误代码403(权限验证未通过),查看请求方法变成OPTIONS.检查请求头得知,当前请求token未带上,问题,为什么post请求变成 ...

  2. JSON.parse() 与 JSON.stringify()

    JSON.parse() 方法用来解析JSON字符串,构造由字符串描述的JavaScript值或对象.提供可选的reviver函数用以在返回之前对所得到的对象执行变换(操作). 语法 JSON.par ...

  3. jquery库与其他库(比如prototype)冲突的解决方法

    前端开发很容易会遇到jQuery库与其他库冲突的场景,比如和prototype库冲突. 实际上这种冲突是因为不同的第三方JS库争夺对$标识符的控制权引起的. 解决方法,就是使用jQuery提供的jQu ...

  4. parallels desktop 的新建虚拟机的步骤

    新建虚拟机的图   点击窗口-----控制中心--再点击控制中心的+号      

  5. 一些个人认为特别的安卓 App 介绍

    MoboPlayer (一款息屏也能播放视频的 App) 快图浏览(快速列出手机中的图片和视频,小巧且不会申请安卓各种权限)

  6. app 崩溃测试 (转:CSDN 我去热饭)

    首先,崩溃有几种情况: 闪退 提示停止运行 无响应 ( 不同情况虽然没有严格意义上区分开引起原因,但是都有侧重.在之后的工作中,我会实时补充统计.) 1.接口返回值 [直接原因]:app无法解析接口返 ...

  7. Java并发专栏(一)—— Process vs Thread

    一.前言 程序是代码和数据的集合,是一种静态实体.不具有代码执行和数据处理的能力,更多是一种行为的描述. 如果将程序和处理器结合,处理器将程序加载至内存,然后执行程序代码处理数据.这时就是可执行的程序 ...

  8. tkmybatis VS mybatisplus

    本文是简单对比了以下官网上的内容 文章目录 TkMybatis Vs MybatisPlus 1.基础CRUD BaseMapper 2.代码生成器 3. 全局主键 Sequence主键 4. 热加载 ...

  9. APUE—UNIX文件系统

    在linux系统中——一切都是文件. 1. 磁盘物理结构 磁盘的物理结构如下: 磁盘由很多盘面组成,而盘面上则是由很多同心圆环组成的磁道,每个磁道又被切割成许多扇区.所有磁盘面的同一个磁道构成一个柱面 ...

  10. ES6-面向对象

    1.老版的面向对象: function User(name,pass){ this.name=name; this.pass=pass; } User.prototype.showName=funct ...