字符串算法的一些总结

已学习

最小表示法

功能:

1.O(N)求一个串的所有循环同构串中字典序 最小/最大 的那个串的起点在原串中的位置

KMP

功能:

1.O(N)求每个前缀的最长相同前后缀

2.O(N+M)进行模式串在匹配串中的查找

3.O(N)判断当前字符串是否循环,若循环则len%(len-fail[len]) = 0

4.O(N)求当前字符串的最小循环节len-fail[len]不管当前是否循环,如果能被len整除(就是3)就是循环的

5.O(N)求当前串最下循环节循环次数k=len/(len-fail[len])就是(如果循环),于是这个串的所有循环同构只有最小循环节种,每种k个。

6.O(N+M)求模式串 与 匹配串的所有后缀 的 最长相同后缀(就是1)

7.O(N+num*N)求num个串的最长公共子串,很黄很暴力

EXKMP

功能:

1.O(N)求每个后缀与原串的最长相同前缀

2.O(N+M)求匹配串所有后缀与模式串的最长相同前缀

3.O(N+num*N)求num个串的最长公共子串

4.O(4*N)判断任一前缀后缀是否回文,串反一下被匹配的ex数组,ex[i]=当前反串后缀长度(与大于后缀长度一半等价)的点正过来的位置对应的前缀就是回文,正串被反串匹配则得到回文后缀,这个方法不太好,判断某一段区间是否回文的问题直接交给马拉车算法就好

Manacher

功能:

1.O(2N)预处理+O(1)判断第l到第r个字符是否回文,直接Len[l+r]>=r-l+1就可以判断,最常用

2.O(2*N)求本质不同回文串种类数,所有长度为1以及匹配过程产生的可能新回文串配合哈希表去重即可

3.O(2*N)预处理+O(2*N)枚举最长回文半径 + O(4*N)差分  =  得出每个前缀,后缀的回文包含的回文串的数量

4.由(3)可以得知所有不相交回文串对数,以及相交回文串对数(总数-不相交)。

KMP+EXKMP+Manacher的题集:https://vjudge.net/contest/125408#problem

后缀数组

功能:

1.O(N*logN)构造+O(N*logN)ST表,就可以O(1)得出一个串的任意两个后缀的LCP,就是求任意两个后缀字典序排序之后中间的height最小值

2.O(N*logN)构造 + O(N)遍历求一个字符串中的最长可重叠子串,即height最大值

3.O(N*logN)构造 + O(N*logN)求不可重叠最长重复子串,二分答案最长长度K logN*每次O(N)遍历,遍历将某一块连续height>=k全部一起讨论,这一块里面任意俩后缀的最长公共前缀都>=k,同时它们与这一部分外都没有>=k的。判断这一部分的字典序的串实际位置相差最大的是否>=k,是,那么本次二分就可以返回TRUE了

4.O(N*logN)构造 + O(N*logN)求出现m次的最长可重叠重复子串,二分答案最长长度K logN * 每次O(N)遍历,把来连续的height>=k的一段统计看是否>=m-1次,有的话本次二次就可以返回TRUE了

5.O(N*logN)构造 + O(N)遍历height  求串中本质不同的串的种类数,按照字典序排序求,每一个串的贡献为len-sa[i]+1个前缀 - height[i]个重复出现的前缀

6.O(N*logN)构造 + O(N*logN)ST表预处理 +  O(N*logN)求得重复次数最多的连续重复子串。

枚举循环节长度L,且每隔L作为间断点,只分析这些点中每相邻的两个点的最长相同前缀LCP,LCP%L得出最后的缀余,此时我们判断当前的点前移L-LCP%L的位置两者的最长相同前缀是否>=L-LCP%L(大于等于这个其实也就是和之前的LCP连起来了)

如果要求重复次数最多的字典序最小的,就需要记录每个最长重复次数可行的长度,然后按照L从小到大的顺序暴力枚举字典序下的所有后缀,判断当前字典序后缀实际位置和实际位置后移L位的两个后缀的LCP是否大于等于L*(最大出现次数-1),是就输出这个串即可,它短且字典序最小,这部分的复杂度是O(N*N)

后缀数组论文(很多题):https://wenku.baidu.com/view/5b886b1ea76e58fafab00374.html

回文自动机/回文树

功能:

https://blog.csdn.net/weixin_43768644/article/details/98311966

题目上面博客里有


正在学的

AC自动机

1.给出一些模式串,构造矩阵求求长度为L的不包含任何一个模式串的 串的种类数

构造矩阵加一列1 求1~L不包含任何一个模式串的 串的种类数(记得答案要-1)

2.根据1的反向思维,可以求出长度为L至少经过一个模式串的 串的种类数

以及1~L至少包含一个模式串的 串的种类数

3.上述问题根据数据量还可以选择用DP解决

4.给出数量较少的模式串,询问至少包含k种长度为L的 串的种类,状压DP,多枚举一维当前的状态,极其暴力

5.给出n个模式串和价值,询问长度为L/1~L的串的最大价值,还可以输出价值最大的中长度最小的中字典序最小的,string乱搞一下就行了

题目做完再整理出来吧


未学习且想学的

后缀自动机

后缀树

后缀平衡树

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值