首页 > 编程语言 >字符串算法总结

字符串算法总结

时间:2025-01-15 23:45:53浏览次数:1  
标签:总结 SAM 后缀 算法 endpos 字符串 自动机 节点

KMP

AC 自动机 ACAM

exKMP Z 函数

manacher

后缀自动机 SAM

结论与思考

  1. 一个节点 \(i\) 到根节点的链上所有节点 endpos 的并集是以 \(i\) 为结尾的所有字符串(以 \(i\) 为结尾的后缀)。
  2. 节点 \(i\) 的 endpos 里所有后缀的出现次数相等,且儿子的 endpos 里的字符串长度一定大于父亲的长度。
  3. 节点 \(i\) 里所有节点各自的出现次数为 \(cnt_i\)。\(cnt_i\) 可以通过树形 dp 后求出。
  4. SAM 上匹配到一个节点后,可以不断删除要匹配的字符串的开头,当长度小于等于父亲的 \(longest\) 时移动到父节点即可。因为节点 \(i\) 存的是以 \(i\) 为结尾的后缀。
  5. 一个等价类,即一个节点 \(i\) 中字符串的个数为 \(len_i-len_{fa_i}\)。
  6. SAM 上从根节点到任意节点的路径是原串的一个子串,原串的一个子串也一定能用某条从根节点出发的路径表示。
  7. SAM 最多只有 \(2n-1\) 个节点, \(3n-4\) 条边。
  8. SAM 的转移边构成一个 DAG。
  9. 父节点的 endpos 集合一定包含了子节点的 endpos 集合。注意 endpos 集合存的是出现位置的末尾。

实现

  1. SAM 具体树形 dp 可以用桶排序代替,实现更小的常数。

后缀数组 SA

回文自动机 PAM

标签:总结,SAM,后缀,算法,endpos,字符串,自动机,节点
From: https://www.cnblogs.com/zhr0102/p/18671696

相关文章

  • 可以用于分割字符串的方法(python)
    一、str.split(sep,maxsplit)函数(返回列表)sep:分隔符maxsplit:分割次数a="Helloworld"list1=a.split("",1)print(list1)结果:['Hello','world']二、str.rsplit(sep,maxsplit)函数(从右边开始分割,返回列表)sep:分隔符maxsplit:分割次数a="Helloworld&q......
  • 151. 反转字符串中的单词
    题目不会做,老老实实看卡哥思路,这里面讲的很详细,有很多值得学习揣摩的东西。在把空格处理好后,先反转整体,再反转其中的单词的方法,很值得学习。即使用整体反转+局部反转就可以实现反转单词顺序的目的跟着卡哥代码敲了一遍:classSolution{public:voidreverse(string&s,i......
  • 55. 右旋字符串(第八期模拟笔试)
    题目自己写的:#include<iostream>#include<string>#include<algorithm>usingnamespacestd;intmain(){intn;strings;cin>>n>>s;reverse(s.begin(),s.end());reverse(s.begin(),s.begin()+n);r......
  • LeetCode字符串
    LeetCode字符串LeetCode字符串刷题记录基础知识字符串和数组很相似每个元素的数据类型相同都可以通过下标索引访问字符串比大小从第0个位置开始,依次比较对应位置上的字符编码大小defcompare(str1,str2):i=0j=0whilei<len(str1)andj<len(s......
  • LeetCode题练习与总结:省份数量--547
    一、题目描述有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。给你一个 nxn 的矩阵 isConnected ,其......
  • LeetCode题练习与总结:游戏玩法分析 Ⅳ -- 550
    一、题目描述SQLSchema> PandasSchema> Table: Activity+--------------+---------+|ColumnName|Type|+--------------+---------+|player_id|int||device_id|int||event_date|date||games_played|int|+----......
  • LeetCode题练习与总结:移除盒子--546
    一、题目描述给出一些不同颜色的盒子 boxes ,盒子的颜色由不同的正数表示。你将经过若干轮操作去去掉盒子,直到所有的盒子都去掉为止。每一轮你可以移除具有相同颜色的连续 k 个盒子(k >=1),这样一轮之后你将得到 k*k 个积分。返回 你能获得的最大积分和 。示例1:......
  • 【前端】前端需要知道的缓存知识总结
    引言......
  • 倍增算法【模板】
    原题链接https://www.luogu.com.cn/problem/P3865题解链接https://blog.csdn.net/WJTF2/article/details/136239183?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522423e6dee0d2c53e9645ecba193312fb3%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257......
  • 令牌桶算法揭秘:原理、优势与实战注意事项
    令牌桶算法是一种流量控制算法,主要用于限制系统的访问频率,就像给系统的访问流量装了一个“阀门”。工作原理想象有一个桶,这个桶里可以放一些“令牌”,每个令牌代表了一次访问的权限。系统会以固定的速度往这个桶里加令牌,比如说每秒加10个。当有请求想要访问系统时,就需要从这......