O(n)的复杂度求回文串:Manacher算法 定义一个回文值,字符串S是K重回文串,当且仅当S是回文串,且其长度为⌊N/2⌋的前缀和长度为⌊N/2⌋的后缀是K−1重回文串 现在给一个2*10^6长度的字符串,求其每个前缀的最大回文值之和. 设dp[i]为长度为i的前缀的最大回文值. 当长度为i的前缀的字符串是回文串的时候,有:dp[i]=dp[i/2]+1 若不是回文串 dp[i]=0 接下来就是怎么样快速的判断回文串了,推荐算法Manacher算法. Manacher算法先对字符串进行修改…
Ball Blasting Game Morteza is playing a ball blasting game. In this game there is a chain of different colored balls. He is expected to explode as many balls as possible by aligning same-colored balls and making a sequence of them. To align balls, he…
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等   Input 输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S两组case之间由空行隔开(该空行不用处理)字符串长度len <= 110000   Output…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3613 题意就是给你一个串s 然后求把s分成两部分之后的价值总和是多少,分开的串 如果是回文那么价值就是每个字母的价值之和,如果不是那么价值就是0: 例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 abbadf 那么可以分成abba 和df abba的价值是1+2+2+1=6,df不是回文串所以价值为0:…
FROM:  http://hi.baidu.com/chenwenwen0210/item/482c84396476f0e02f8ec230 #include<stdio.h> #include<math.h> #include<string.h> #include<map> #include<algorithm> #include<queue> using namespace std; typedef __int64 lld;  …
推荐两个讲得很好的博客: http://blog.sina.com.cn/s/blog_70811e1a01014esn.html https://segmentfault.com/a/1190000003914228 #include<cstring> #include<cstdio> #include<algorithm> #define N (22000010) using namespace std; int n, ans, mid, mx; int p[N];…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目大意: 题目大意就是将字符串s分成两部分子串,若子串是回文串则需计算价值,否则价值为0,求分割字符串s能获得的最大价值. 解题思路: 用manacher算法计算出p[i],每次计算p[i]是顺便计算一下这段回文串是否能到达边界,若能则计算出前缀或者后缀的结束位置,标记起来.//还有之前数组开1e6+5教C++是错的,改成2e6+5就对了,不觉明历.... 代码(复杂点的) #include…
题意 : 给个字符串S,要把S分成两段T1,T2,每个字母都有一个对应的价值,如果T1,T2是回文串,那么他们就会有一个价值,这个价值是这个串的所有字母价值之和,如果不是回文串,那么这串价值就为0.问最多能获得多少价值? 分析 : 有两种做法,第一种是拓展KMP正反跑两次或者Manacher ①如果我们用原串去和反转串( 即将原串反转 )跑一次拓展KMP得到的 extend 能够帮助我们得到原串前缀的某一段是否是回文串,仅当 extend[i] = 整个后缀长度,而用反转串去和原串跑一次拓展KM…
题目链接: https://cn.vjudge.net/problem/HDU-3613 After an uphill battle, General Li won a great victory. Now the head of state decide to reward him with honor and treasures for his great exploit. One of these treasures is a necklace made up of 26 differe…
http://acm.hdu.edu.cn/showproblem.php?pid=3613 Best Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1210    Accepted Submission(s): 495 Problem Description After an uphill battle, General…
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2342 思路:先跑一遍Manacher求出p[i]为每个位置为中心的回文半径,因为双倍回文串的长度一定是4的倍数,即偶数,那么对于Manacher的回文中心一定是'#'字符.所以我们枚举每个'#',对于每个'#'当回文半径大于等于4才有可能成为双倍回文.如果当前位置的i是'#'且满足以上条件.那么我们就找到i右边的j.因为双倍回文的长度是4的倍数,那么i右边的j的回文长度一定是2的倍数,即…
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2565 题意:中文题 思路:定义L[i],R[i].表示以i为左端点/右端点时,最长回文串长度.那么答案就是L[i]+R[i]的最大值.问题转化为怎么求L[i],R[i].我们通过用Manacher可以求出以i为中心的最长回文串半径.然后再通过暴力+剪枝的方法对于每一个i和对应的最长半径求更新L[i],R[i]. #include<iostream> #include<cstdio…
题目链接:http://poj.org/problem?id=3974 题意:求出给定字符串的最长回文串长度. 思路:裸的Manacher模板题. #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<algorithm> using namespace std; +; typedef long l…
求最长回文串的利器 - Manacher算法 Manacher主要是用来求某个字符串的最长回文子串. 不要被manacher这个名字吓倒了,其实manacher算法很简单,也很容易理解,程序短,时间复杂度为O(n). 求最长回文子串这个问题,我听说有个分治+拓展kmp的算法,后缀数组也可以. 但是对于求回文串来说,manacher算法肯定有很多其他算法没有的优点. 现在进入正题: 首先,在字符串s中,用rad[i]表示第i个字符的回文半径,即rad[i]尽可能大,且满足: s[i-rad[i],…
HDU   3613 Description After an uphill battle, General Li won a great victory. Now the head of state decide to reward him with honor and treasures for his great exploit. One of these treasures is a necklace made up of 26 different kinds of gemstones,…
Manacher算法能够在O(N)的时间复杂度内得到一个字符串以任意位置为中心的回文子串.其算法的基本原理就是利用已知回文串的左半部分来推导右半部分. 转:http://blog.sina.com.cn/s/blog_70811e1a01014esn.html 首先,在字符串s中,用rad[i]表示第i个字符的回文半径,即rad[i]尽可能大,且满足:s[i-rad[i],i-1]=s[i+1,i+rad[i]]很明显,求出了所有的rad,就求出了所有的长度为奇数的回文子串.至于偶数的怎么求,最…
给定一个字符串求出其中最长个公共回文串. 举列子: abab   -->回文串长度为2 以前的算法诸如: 扩展kmp求法过于麻烦,看到有一篇博文(http://leetcode.com/2011/11/longest-palindromic-substring-part-ii.html),写了一个关于这样的算法,按耐不住自己内心的小激动,就去学了下,于是将自己学习的一点点的理解记录下来: 它的处理方法是:  对于这样一个字符串: abab: a b a b     我们对于每一个字符串的进行逐个…
回文的含义是:正着看和倒着看相同,如abba和yyxyy        Manacher算法基本要点:用一个非常巧妙的方式,将所有可能的奇数/偶数长度的回文子串都转换成了奇数长度:在每个字符的两边都插入一个特殊的符号.比如 abba 变成 #a#b#b#a#, aba变成 #a#b#a#. 为了进一步减少编码的复杂度,可以在字符串的开始加入另一个特殊字符,这样就不用特殊处理越界问题,比如$#a#b#a#. P[id]:以字符str[id]为中心的最长回文串,当以str[id]为第一个字符时,这个…
题目大意:给以一个字符串,求出来这个字符串的最长回文串,不过这个字符串不是原串,而是转换过的,转换的原则就是先给一个字符 例如 'b' 意思就是字符把字符b转换成字符 a,那么c->b, d->c.....a->z,大致就是这么个意思,然后求出最大回文串就行(回文串至少长度也得等于2).   分析:字符转换没什么可说的,求回文串可以使用Manacher算法,主要说一下怎么用 p数组保存的信息求原来的区间,因为p保存的是扩展串的匹配数目,p[i]就是保存的最大匹配值,我们可以先求出来它的最…
1699: 回文串问题 时间限制: 1 Sec  内存限制: 128 MB 提交: 22  解决: 3 [提交][状态][讨论版] 题目描述 还是回文串问题,字符串是啥,大家应该都知道,就是满足 S[i] = S[L - i + 1] (1 <= i <= L)的串,现在遇到了一个问题,就是想问你一个字符串最少在后边加几个字符可以形成一个回文串,并最后输出形成的回文串 输入 输入包括多组数据,每组数据包含一个字符串 输出 输出转换后的回文字符串 样例输入 add cigartragic dxh…
2565: 最长双回文串 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1842  Solved: 935[Submit][Status][Discuss] Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分X,Y,(|X|,|Y|≥1)且X和Y都是回文串. Input 一行由小写…
题目链接:Longest Palindromic Substring 1. 问题描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 2. 各种解法复杂度 暴力枚举:O(N^2) 记忆化搜索:O(N…
用来求字符串最长回文串或者回文串的总数量 #include<map> #include<queue> #include<stack> #include<cmath> #include<vector> #include<stdio.h> #include<float.h> #include<string.h> #include<iostream> #include<algorithm> #…
题意 https://www.lydsy.com/JudgeOnline/problem.php?id=3676 思路 好像还是回文自动机裸体,但是 \(\text{Manacher}\) +后缀自动机+倍增也可以解决. 首先可以一遍 \(\text{Manacher}\) 得到本质不同的回文串,然后分别求一次出现次数,更新答案.不能发现后缀自动机可以比较轻松的求出一个字串的出现次数,但是需要快速回答.所以需要快速找到一个字串在后缀自动机上的所属节点. 注意到后缀链接连接着一段后缀相等的位置,所…
链接:https://ac.nowcoder.com/acm/contest/549/B来源:牛客网 题目描述 小A非常喜欢回文串,当然我们都知道回文串这种情况是非常特殊的.所以小A只想知道给定的一个字符串的最大回文子串是多少,但是小A对这个结果并不是非常满意.现在小A可以对这个字符串做一些改动,他可以把这个字符串最前面的某一段连续的字符(不改变顺序)移动到原先字符串的末尾.那么请问小A通过这样的操作之后(也可以选择不移动)能够得到最大回文子串的长度是多少. 输入描述: 一行一个字符串表示给定的…
题目分析: 我写了史上最丑的后缀数组,怎么办? 首先manacher一遍两个串,这样只用考虑第三问.用$作为间隔符拼接两个串,把第一个串翻转.枚举回文中心,取最长的回文串,对于剩下的部分利用LCP匹配即可. 代码: #include<bits/stdc++.h> using namespace std; #define Sec first.second #define Fir first.first ; ]; string s1,s2,vk; ]; void read(){cin >&g…
BZOJ 洛谷 求给定串的最长双回文串. \(n\leq10^5\). Manacher: 记\(R_i\)表示以\(i\)位置为结尾的最长回文串长度,\(L_i\)表示以\(i\)开头的最长回文串长度.答案就是\(\max\{R_i+L_{i+1}\}\).式子可能会有差别,因为Manacher会在里面加字符.当然我们直接只用'#'位置的\(L_i+R_i\)就可以更新答案啦. Manacher,然后对于位置\(i\),设它的最远延伸距离是\(ex_i\). 然后用\(i-j\)更新\(L_j…
[Manacher算法] 这个算法用来找出一个字符串中最长的回文子字符串. 如果采取暴力解最长回文子字符串问题,大概可以有两种思路:1. 遍历出所有子字符串找其中最长的回文 2. 从每个字符作为中心,向两边扩散看是否回文. 第二种比第一种稍微高明一点,但是总体的复杂度还是O(n^2)的. 而Manacher算法可以做到O(n)时间复杂度,O(n)空间复杂度. ■ 思路&描述 回文字符串有一个比较麻烦的地方,就是回文串有偶回文和奇回文两种,分别举例ABBA和ABCBA.这种区别可能要让我们在程序中…
正解:manacher+哈希 解题报告: 传送门 要不要先解释下题意,,,我开始看了半天来着QAQ 大概就,要求一个最长的回文串 这个回文串有两种构成可能 一种是单从一个串中拿出来的连续一段 另一种是两个串各拿出连续一段拼起来,其中这两段需要满足第一段的右端点坐标=第二段的左端点坐标 欧克然后看题趴QwQ 首先但从一个串中拿就直接跑个manacher就好 然后问题就在这个从两个串中各拿出一段 首先如果这是个回文串,显然它一定是有一段的一侧是本来就有的回文串,然后另一侧和另一个串构成回文串这样子的…
顺序和逆序读起来完全一样的串叫做回文串.比如 acbca 是回文串,而 abc 不是( abc 的顺序为 “abc” ,逆序为 “cba” ,不相同). 输入长度为 n 的串 S ,求 S 的最长双回文子串 T, 即可将 T 分为两部分 X , Y ,( |X|,|Y|≥1 )且 X 和 Y 都是回文串. Input 一行由小写英文字母组成的字符串S. Output 一行一个整数,表示最长双回文子串的长度. Sample Input baacaabbacabb Sample Output 12…