2018.8.1字符串(汪乐平)

KMP

例题

T1:最小循环节

如果 ( n n e x t [ n ] ) 是n的因子,那么最小循环节长度就是这个,否则是n

T2:NOI2014动物园

沿着KMP自动机按照树边累加贡献

Hash

例题

T1:

把每个串丢进hash,求一下就行了
注意特判0

T2 UOJ后缀排序

二分+hash求LCP就行了

T3:

二分+hash,需要把hash值丢进splay维护

马拉车

例题

T1:

直接加起来就行了

T2:

hash去个重就行了

Trie

例题

T1:题面同前面

二分答案,按照height分为若干组
查询有没有一组超过k
在树上跑的时候加权值判断一下
要特判0

AC自动机

例题

T1:TJOI2013

沿着fail树直接累加贡献

T2:POI2000

如果某个前缀的fail包含了某个模式串,那么这个前缀也包含某个模式串

把所有模式串打上标记,标记沿fail树下传

考虑没有打标记的结点,如果存在环则有长度无限的主串

后缀数组

例题

T1:

二分答案,按height将后缀分为若干组,查找有没有某一组后缀个数>=k即可

T2:JSOI2007 字符加密

倍长

T3:AHOI2013差异

后缀自动机

例题

T1:封印

加字符串以及在末尾加字符都是很好处理的
在开头加字符我们需要在SAM的反串后缀树上跳才正确
查询的时候在dfs序上用主席树查询

T2:诸神眷顾的幻想乡

给每个叶子结点建立一颗trie
合并成一颗trie
给这颗trie建SAM,求一遍 Σ l e n [ x ] l e n [ f a i l [ x ] ]

后缀平衡树

SAM很多东西是不能动态的
于是出现了后缀平衡树
本质上是用平衡树维护后缀数组
对于每个后缀维护一个标号,满足较小的后缀标号较小

标号按照类似线段树的思想标号
但是这样就不能旋转了
做法①:不旋转(使用替罪羊树)
做法②:保证旋转的复杂度(使用treap)

例题

T1:BZOJ2555

当然是SAM+LCT啦(逃)
可以用后缀平衡树
询问等价于>=t,

T2:STRQUERY

考虑如何维护
只考虑在头尾插入删除
先考虑维护一个正向一个反向的后缀平衡树
那么在头尾插入删除就相当于对这两个后缀平衡树进行操作
考虑中间怎么处理
从中间截断,前后各维护两个,总共维护4个后缀平衡树,每次在对应位置操作。然后维护两段长度相等

询问操作如果单在左边右边我们只要在平衡树内查询即可。如果跨了左右平衡树,那么我们暴力kmp做,时间复杂度是可以保证的

猜你喜欢

转载自blog.csdn.net/a1035719430/article/details/81349989