首页 > 其他分享 >APIO2014 回文串

APIO2014 回文串

时间:2024-01-23 20:33:34浏览次数:29  
标签:子串 set log 复杂度 APIO2014 回文

APIO2014 回文串

decription

给定一个长度为 \(n\) 的字符串 \(S\)。求其所有回文子串中出现次数乘上长度的最大值。

  • \(n\leq 3\times 10^5\)

solution

根据经典结论,长度为 \(n\) 的字符串的本质不同回文子串个数不超过 \(n\) 个,我们可以找出所有本质不同回文子串,然后计算它们的贡献。

找出每个回文中心的最长回文长度可以通过二分和字符串哈希来实现。拿个 set 记录已经出现过的本质不同回文子串的哈希值。因为边界离回文中心远的子串更有可能此前没有出现过,所以可以从二分出来的边界向内遍历,每次在 set 内查是否出现过,没有的话就计算对答案的贡献并加入 set

容易发现,找出所有本质不同回文子串的时间复杂度是 \(O(n\log n)\) 的。

下面来解决如何计算一个子串在原串中的出现次数。

处理出原串的 SAM 以及每个前缀对应的状态编号,预处理 parent 树的祖先倍增数组。

查询 \(S_{l\dots r}\) 的出现次数时,就从 \(S_{1\dots r}\) 对应的节点开始倍增,直到 \(\text{len}<r-l+1\)。

这么做时间复杂度是 \(O((n+m)\log n)\) 的,空间复杂度是 \(O(n\log n)\)。

于是这题就做完了。

需要注意的是,128 MiB 的空间十分紧张,需要把 SAM 的空间搞成线性的(似乎 map 都卡不过去,我是手写的 treap),然后再卡一卡倍增数组。

这题卡自然溢出。

SHOI 2011 双倍回文 也可以这么做。

标签:子串,set,log,复杂度,APIO2014,回文
From: https://www.cnblogs.com/FreshOrange/p/17983367

相关文章

  • 代码随想录 day27 组合总和 组合总和 II 分割回文串
    组合总和其实总的思路和前面几类组合问题区别不大本题由于说明了元素可以重复选取且无需考虑sum为0的情况只需要把边界的startIndex迭代从i+1变成i即可i表示可以选取元素本身很容易写出以下未进行剪枝的代码剪枝情况只是多了一种也就是sum+下一个候选元素>targ......
  • 【算法】【字符串】验证回文串
    1 题目如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。字母和数字都属于字母数字字符。给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。示例1:输入:s="Aman,a......
  • 5.最长回文子串
    1.题目介绍给你一个字符串s,找到s中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。示例1:输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答案示例2:输入:s="cbbd"输出:"bb"2.题解2.1动态规划思路对于一个子串而言,如果它是回......
  • 分割回文串 131
    这也是用回溯解决,回溯就是多层for循环,但是这一题有点难发现多层for循环体现在哪里。实际上该问题for循环的层数与字符串的间隔有关for循环的层数代表,分割线的个数;for循环的遍历代表这分割线的位置。这里引用卡哥的图:因为分割线不能取前一个的位置,所以要根据之前组合那题的套......
  • 回文字串
    回文串一般可以考虑把串倒过来思考问题对一个给定的串,我们将其倒序,设其长度为\(l\),求出原串和倒序的串的LCS,设长度为\(x\),则答案为\(l-x\)证明:我们假设已经获得了最终的回文串,然后我们将这个回文串倒序,那么肯定这个回文串与这个原串是相等的以样例为例其中红色字符是添加的......
  • 吴师兄学算法day07 双指针 680. 验证回文串 II
    题目:680. 验证回文串II易错点:s[1:3]是左闭右开我的第一次代码:classSolution(object):defvalidPalindrome(self,s):""":types:str:rtype:bool"""isPalindrome=lambdax:x==x[::-1]l......
  • 吴师兄学算法day07 双指针 125. 验证回文串
    题目:125. 验证回文串易错点:isaplha()isdigit()lower()要熟悉,挺有用的。我的代码:classSolution:defisPalindrome(self,s:str)->bool:ans=''foriins:ifi.isalpha()ori.isdigit():ans+=i.lower()#......
  • 吴师兄学算法day07 双指针 9. 回文数
    题目:9. 回文数易错点:右指针要记得移动我的代码:classSolution:defisPalindrome(self,x:int)->bool:array=list(str(x))right=len(array)-1forleftinrange(len(array)//2):ifarray[left]==array[right]:......
  • [刷题班] LeetCode125. 验证回文串
    题目描述思路:左右指针只考虑数字和字母字母的话需要全部转化为小写然后使用左右指针判断是否是回文串方法一:classSolution{publicbooleanisPalindrome(Strings){List<Character>list=newArrayList<>();for(charc:s.toCharArray()){......
  • 算法学习Day26组合总和、分割回文串
    Day26组合总和、分割回文串ByHQWQF2024/01/13笔记39.组合总和给定一个无重复元素的数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。candidates中的数字可以无限制重复被选取。说明:所有数字(包括target)都是正整数。解集......