【WC笔记】字符串前沿算法

Q1

对于给定的字符串,求本质不同的子串数。

A1

在加入 $s_l$ 时,考虑 $s[l:r]$ 的上一次出现是 $s[k:k+r-l]$,那么应该在线段树上 $[r,k+r-l]$ 这个区间 $+1$。

那么假设路径 $(x,y)$ 上的点都满足 $r_u=z$,且 $len[fa[x]]=a,space len[y]=b$,

那么对线段树的贡献是一个类似平行四边形的加法,修改比较显然。

查询 $s[l:r]$ 的本质不同的子串数的话,在假如 $s[l]$ 后查询线段树的第 $r$ 个位置即可。

Q2

对于给定的字符串 $s$,求 $s[l:r]$ 的后缀树节点数。

source:《后缀树节点数》命题报告及一类区间问题的优化——陈江伦

A2

建出后缀树

Q3

这个 $idea$ 比较简单就直接放在一个题目里说了。

维护一个字符串 $s$,支持在 $s$ 的某个位置插入一个字符串,删除 $s$ 某一段的字符串。

可以看成是一个普通的文本编辑器。

由于在文本编辑器里进行搜索的时候我们都是一个一个字母键入的,为了模拟这一过程,每次询问给出一个询问串 $p$,对于每一个 $1le ile |p|$,你需要回答 $p[:i]$ 在 $s[l:r]$ 中出现了多少次。

只需要三个操作都比暴力快即可($O(|s|$)。

A3

块状链表

Q4

给定一个字符串 $s$,每次 $O(1)$ 询问 $s[l:r]$ 的最大后缀。

原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/wc20190126.html