Professional Documents
Culture Documents
后缀数组
后缀数组
后缀 表示从某个位置 开始到整个串末尾结束
后缀数组的实现
倍增算法
倍增算法的思路为:⽤倍增的⽅法对每个字符开始的⻓度为 的⼦字符串进⾏排序,求出排名,即
值。 从0开始,每次加⼀,当 ⼤于 以后,每个字符开始的⻓度为 就是所有的后缀。每⼀次
排序都利⽤上次⻓度为 的字符串的 值
代码
应⽤
两⼦串的最⻓公共前缀
求两⼦串最⻓公共前缀就转换为了RMQ问题
单个字符串的相关问题
这类问题的常⻅做法就是先求后缀数组和 数组,然后利⽤ 数组进⾏求解
重复⼦串
重复⼦串:字符串R在字符串L中⾄少出现两次,则称R为L的重复⼦串
可重叠最⻓重复⼦串
等价于求 数组的最⼤值,因为任意两个后缀的最⻓公共前缀就是 数组⾥的某⼀段的最⼩
值
不可重叠最⻓重复⼦串
⼆分答案,判断是否存在两个⻓度为k的⼦串是相同的,且不重叠。
将排序后的后缀分成若⼲组,其中每组的后缀之间的 值都不⼩于k,再判断每组中每个后缀的
值的最⼤值和最⼩值的是否不⼩于k。
可重叠的k次的最⻓重叠⼦串
给定⼀个字符串,求⾄少出现k次的最⻓重复⼦串,这k个⼦串可以重叠。
先⼆分答案,将后缀分为若⼲组,判断存在⼀个组内存在后缀个数不少于k。
⼦串的个数
不相同的⼦串的个数:给定⼀个字符串,求不相同的⼦串的个数。
回⽂⼦串
最⻓回⽂⼦串
计算以每个字符为中⼼的最⻓回⽂串,转化为求⼀个后缀和⼀个反过来的后缀的最⻓公共前缀,将整个
字符串逆反拼接在原字符串后⾯,中间加上特殊字符,再求出新字符串的某两个后缀的最⻓公共前缀。
连续重复⼦串
连续重复串:字符串L是由字符串S重复R次得到
最⻓重复⼦串
枚举字符串S的⻓度k,判断字符串L的⻓度是否能整除k并且判断 与 的lcp是
否为n-k。
重复次数最多的连续⼦串
两个字符串的相关问题
这类问题的常⻅做法:先连接两个字符串,然后求后缀数组和 数组,再利⽤ 数组进⾏求
解。
公共⼦串
公共⼦串指字符串L同时出现在字符串A和字符串B中
最⻓公共⼦串
将两个字符串拼接在⼀起,中间加上没有出现的特殊字符,求出满⾜ 和
不是同⼀个字符串中的两个后缀时, 的最⼤值
⼦串的个数
给定两个字符串A和B,求⻓度不少于k的公共⼦串的个数。
基本思路是计算A的所有后缀和B的所有后缀之间的最⻓公共前缀的⻓度,把最⻓公共前缀⻓度不少于k
的部分全部加起来。对 分组后,没遇到⼀个B的后缀就统计与前⾯的A的后缀能产⽣多少个⻓度
不少于k的公共⼦串。