前几天bestcode做到一道字符串的题目,需要O(n)的回文,正好看到网上的manacher算法,于是来学习一发
进入正题:
manacher算法
用法:一般用于求一个字符串的最大回文,操作过程中会记录以每个点为中心的回文半径,可用来进行其他操作
时间复杂度:O(n)
空间复杂度:记录字符串2*n,半径数组2*n
内容:
记p[i]为以i为中心的回文半径(a...
分类:
编程语言 时间:
2015-08-04 17:16:17
阅读次数:
194
题意:给你一个字符串问能否拆分为三个回文字符串?能就输出yes,否则输出no。知识补充:最长回文子串算法(Manacher算法):求解最长回文子串的线性时间复杂度算法,主要是通过中心扩展的方法极大地避免了重复计算。实现如下:
为了避免对字符串奇偶数的讨论,先对字符串做预处理如下:
规则为在字符间和两边插入'#'字符,为了避免越界处理,最两边插入'^'和'$'字符。
原本字符串为:asd
预处理后为:...
分类:
其他好文 时间:
2015-08-04 13:37:34
阅读次数:
121
前几晚 BC 的第二题,官方给出的题解是: 然后我结合昨天刚看的 Manacher 算法试着写了下,发现 pre、suf 数组挺难构造的,调试了好久,然后就对中间进行枚举了,复杂度应该是 O(n2) 吧,我第一次交时超时了,以为真的要用什么暴力压位,可是我还不会啊,然后作了一些少许的优化提交本...
分类:
其他好文 时间:
2015-08-04 13:09:10
阅读次数:
116
今天打算补前晚 BC 的第二题,发现要用到能在 O(n) 时间求最大回文子串长度的Manacher 算法,第一次听,于是便去百度了下,看了大半天,总算能看懂了其思想,至于他给出的代码模板我没能完全看懂,只好自己试着实现,发现理解了思想后还是能实现出来的,用自己的风格去写更好理解,先附上讲解Man.....
分类:
编程语言 时间:
2015-08-03 20:49:43
阅读次数:
142
题目地址:HDU 5340
题意:问是否能将字符串str分解为三段非空的回文串。
思路:我们根据Manacher算法对字符串进行处理,处理过程中产生的P数组,我们可以得到两个数组first和last。
first存储的是第一个回文串的半径可能值。
last存储的是第三个回文串的半径可能值。
根据first和last我们可以枚举第一个回文串和第三个回文串,然后根据半径找出第二个回文串的初始位...
分类:
编程语言 时间:
2015-08-03 17:00:40
阅读次数:
389
题目地址:HDU 3068
关于算法的详解:Manacher算法#include
#include
#include
#include
#include
#include
#include
#include
#include ...
分类:
编程语言 时间:
2015-08-03 14:47:03
阅读次数:
153
题目地址:POJ 3974
题意:求最长的回文串。
思路:同样是用Mancher算法在O(n)的时间内解决(我其实是来练练板子的#include
#include
#include
#include
#include
#include
#include <algorithm...
分类:
编程语言 时间:
2015-08-03 14:39:08
阅读次数:
99
题目链接: Hdu 3294 Girls' research题目描述: 给出一串字符串代表暗码,暗码字符是通过明码循环移位得到的,比如给定b,就有b == a,c == b,d == c,.......,a == z。问最长回文串所在区间,以及最长回文串所表示的明码。解题思路: 字符串长度[1...
分类:
其他好文 时间:
2015-08-03 11:32:28
阅读次数:
118
Three Palindromes
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 809 Accepted Submission(s): 240
Problem Description
Can we divided...
分类:
其他好文 时间:
2015-08-02 21:44:34
阅读次数:
127
题目描述:
判断是否能将字符串S分成三段非空回文串。
解题思路:
基本思路:我们可以枚举第一个字符串的结尾e和第三个字符串的开始s,那么第二个字符串就是从e+1到s-1,判断第二个字符串是否为回文即可...
分类:
其他好文 时间:
2015-08-02 18:22:12
阅读次数:
195