首页 > 其他分享 >回文树

回文树

时间:2024-03-13 20:36:34浏览次数:27  
标签:字符 后缀 扩展 插入 回文 字典

例题 HDU-5421 翻译

如果字符串是静态的,则可以使用 Manacher 算法。但本题的字符串可以动态在首位添加字符,无法使用 Manacher。

本题可以使用回文树(回文自动机)算法。该算法的时间复杂度为 \(\mathcal{O}(N)\),但空间复杂度较差,因为其本质上是字典树。

1 回文树的关键技术

回文树的关键技术为奇偶字典树 \(+\) 后缀链跳跃。下面给出思维过程。

  1. 后缀链跳跃

比如在 abcb 后面插入 a,则新插入的 a 与第一个 a 之间的所有字符构成了一个回文串。

那如果是插入了 c,其不能与开头的 a 构成回文串,该怎么办呢?

可以发现上面插入 a 时,本质上就是尝试在原串的后缀回文串 bcb 左右各扩展一个字符。如果新插入的字符与上一个回文串的前一个字母相同,那这个回文串就可以向左右各扩展一个字符了。但如果不同,那我们就应该找下一个短一点的回文串进行尝试,如上面的例子中尝试扩展 bcb 失败,接下来以最后一个 b 结尾的最长回文串为 b 本身,我们再尝试扩展它,扩展成功。b 扩展成为 bcb

我们称这个不断找最长后缀回文串的过程为后缀链跳跃

  1. 奇偶字典树

我们可以用两棵字典树来存储回文串,一棵存长度为奇数的,一棵存长度为偶数的。我们可以用结点 \(0,1\) 分别表示偶数字典树和奇数字典树的根。在存储回文串时,我们只存一半。比如回文串 abccba,我们在偶数字典树上加入 \(0 \to\) c \(\to\) b \(\to\) a,这样我们从下往上读,读到 \(0\) 后再读下来就是原串。如果是 abcba,那我们在奇数字典树上加入 \(0 \to\) c \(\to\) b \(\to\) a,这样我们从下往上读再读回来,但最上面的边只读一次。

下图是 zaacaac 的存储方式:

  1. 建回文树

标签:字符,后缀,扩展,插入,回文,字典
From: https://www.cnblogs.com/lrxmg139/p/18071448

相关文章

  • 回文自动机学习笔记
    回文自动机学习笔记定义所谓自动机,是一个对信号序列进行判定的数学模型。即对一连串有顺序的信号关于某一个判定给出或真或假的判定。所谓回文自动机,就是对一个字符串进行其是否为回文串的判定。也就是存储字符串\(s\)中的所有的回文串。与\(\text{SA}\)不同的是,\(\text{SA......
  • 判断链表回文
    题目://方法一,空间复杂度O(n)classSolution{public:boolisPalindrome(ListNode*head){vector<int>nums;//放进数组后用双指针判断ListNode*cur=head;while(cur){nums.emplace_back(cur->val);cur=......
  • 131. 分割回文串c
    这题真的坑爹啊,不明白为什么会产生万大小的数据啊。/***Returnanarrayofarraysofsize*returnSize.*Thesizesofthearraysarereturnedas*returnColumnSizesarray.*Note:Bothreturnedarrayand*columnSizesarraymustbemalloced,assumecallerca......
  • 初三奥赛模拟测试1--T1回文
    初三奥赛模拟测试1--\(T1\)回文HZOI题意给定一个\(n\timesm\)的,由字符组成的矩阵\(A\),问你由\((1,1)\)开始,点\((i,j)\)只可以往\((i+1,j)\)和\((i,j+1)\)走,走到\((n,m)\)停。记录路径,问由路径上的字符构成的字符串能是回文串......
  • 小红的回文数
    引言题目连接:https://ac.nowcoder.com/acm/contest/75174/E思路随意选取一段区间,对其长度进行分类讨论:若其长度为偶数,则0~9这十个数字在该区间内出现的次数为偶数时,可以将该区间重构成回文。若其长度为奇数,则满足0~9这十个数有一个出现次数是奇数,其余数为偶数则......
  • 9.回文数
    完成度:完成但是较为复杂问题:自己写的时候写了一堆思路还要折中算法啥的,但是看了答案发现果然还得是大佬写出来更方便的,直接用另一个变量赋值后面再和x比较。这道题看答案如果是自己写的话想不到while(x>revert){revert=revert*10+x%10;x=x/10;}returnxrevert||xrevert/10;......
  • leedcode 验证回文串
    自己写的:classSolution:defisPalindrome(self,s:str):#将字符串转换为小写,以便进行大小写不敏感的比较s_lower=s.lower()#获取字符串的长度n=len(s_lower)#创建一个空列表,用于存储字母和数字......
  • (26/60)组合总和、组合总和Ⅱ、分割回文串
    组合总和leetcode:39.组合总和回溯法思路在组合的基础上,只不过同一个数字可以重复选取,递归时传入i即可(组合是传入i+1)。复杂度分析时间复杂度:在最坏情况下,回溯算法会遍历所有可能的组合,因此时间复杂度取决于解的个数。假设候选数组的长度为n,目标值为target,最坏情况下解的......
  • 【Python】 回文数的四种解法
    回文数就是指整数倒过来和原整数相等。1234Example1:  Input:121Output:true12345Example2:  Input:-121Output:falseExplanation:Fromlefttoright,itreads-121.Fromrighttoleft,itbecomes121-.Therefore......
  • 代码随想录 day60 回文子串 最长回文子序列
    回文子串dp[i][j]:[i,j]范围内为回文子串递推式分三种情况①:ij相等显然是回文②:j-i<1且s[i]==s[j]显然是回文③:j-i>1且dp[i+1][j-1]为true也就是当前两端元素相同看元素内部是否是回文如果是显然是ij范围内是回文初始化必须初始化falset......