最大长度回文子串(Manacher's algorithm)

输出最大长度的回文子串。

 1 string longestPalindrome(string s)
 2 {
 3
 4
 5     int id, mx, i, j, len, maxlen;
 6     vector<char> cvec;
 7     vector<int> ivec;
 8     string str;
 9     int ma, k;
10
11     id = 0;
12     mx = 0;
13     ivec.push_back(1);
14     len = s.size();
15     maxlen = 2*s.size() + 1;
16
17     for (i = 0; i < len; ++i)
18     {
19         cvec.push_back(‘#‘);
20         cvec.push_back(s[i]);
21     }
22     cvec.push_back(‘#‘);
23
24
25     for (i = 1; i < maxlen; ++i)
26     {
27         if (mx > i)
28         {
29             int temp;
30             temp = ((mx - i - 1) > (ivec[2*id - i])) ? (ivec[2*id - i]) : (mx - i - 1);
31             ivec.push_back(temp);
32         }
33         else
34             ivec.push_back(1);
35
36         for (; (i - ivec[i] >= 0) && ((i + ivec[i]) < maxlen) && (cvec[i-ivec[i]] == cvec[i+ivec[i]]); ++ivec[i])
37             ;
38
39         if (mx < ivec[i] + i -1 )
40         {
41             mx = ivec[i] + i - 1;
42             id = i;
43         }
44     }
45
46     ma = 0;
47     for (i = 0; i < maxlen; ++i)
48     {
49         if (ivec[i] > ma)
50         {
51             ma = ivec[i];
52             k = i;
53         }
54     }
55
56     for (j = 0, i = k - ivec[k] + 1; j < ivec[k] - 1; ++i, ++j)
57     {
58         ++i;
59         str.push_back(cvec[i]);
60     }
61
62     return str;
63 }

最大长度回文子串(Manacher's algorithm)

时间: 2024-10-10 06:36:46

最大长度回文子串(Manacher's algorithm)的相关文章

Girls&#39; research---hdu3294(回文子串manacher)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3294 给出一个字符串和加密的字符规律 例如 c abcba c代表把串中的c改成a,d改成b... b改成z,a改成y... 即上串是yzazy,然后求出它的最长回文子串, 并记录子串的开始下标和结束下标就行了: #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; con

HiHo 1032 最长回文子串 (Manacher算法求解)

Manacher算法o(n)求解最长回文子串问题 非常巧妙 #include<bits/stdc++.h> using namespace std; char str[2000020],s[2000020]; int p[2000020]; int len,id,mx; void pre() //对字符串进行预处理 { len=strlen(s); str[0]='$'; str[1]='#'; for(int i=0;i<len;i++) { str[i*2+2]=s[i]; str[

hiho#1032 : 最长回文子串 (manacher算法O(n)时间求字符串的最长回文子串 )

#1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:"小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?" 小Ho奇怪的问道:"什么叫做最长回文子串呢?" 小Hi回答道:"一个字符串中连续的一

hihocoder 1032 : 最长回文子串(Manacher)

之前做过类似的题,只是理解了,还没达到驾轻就熟,想到即敲出的地步,所以再练一次. 顺带将Manacher算法思想解释一遍,加强印象,也算作分享吧. Manacher 我们用f(x)表示以x位置为中心的回文串的长度 j相对i的对应位置是j' 那么f(j)与f(j')和f(i)有什么关系呢. 先看第一张图,下面那条横杠表示f(i),那么,既然j'与j相对应,j'的回文串长度已经求出,那么j位置的回文串长度一定是大于等于j'长度的. 即f(i) >= f(j')=f(i*2-j) 但是还存在上图这样的

hihoCoder #1032 : 最长回文子串 [ Manacher算法--O(n)回文子串算法 ]

传送门 #1032 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能分别在这些字符串中找到它们每一个的最长回文子串呢?” 小Ho奇怪的问道:“什么叫做最长回文子串呢?” 小Hi回答道:“一个字符串中连续的一段就是这个字符串的子串,而回文串

最长回文子串 - Manacher算法

算法思想: 设有字符串s[] = "121" 第一步:通过在每个字符左右都添加一个特殊字符,把奇数长度和偶数长度的字符串都转化成奇数(例如. "121" 加上特殊字符后变成"#1#2#1" ),同时也可在开头再加一个特殊字符,以便于忽略越界问题(如上例"121"变成"$#1#2#1#"  此时开头的特殊字符$和字符串末尾的\0与此串中其他字符都不同,即可忽略越界问题),此时字符串变成 s[] = "

最长回文子串Manacher算法模板

Manacher算法能够在O(N)的时间复杂度内得到一个字符串以任意位置为中心的回文子串.其算法的基本原理就是利用已知回文串的左半部分来推导右半部分. 例题:HDU 3068 1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 const int N=110005; 6 char s[N],cpy[N<<1]; 7 int rad[N&l

Best Reward HDU 3613(回文子串Manacher)

题目大意:有一个串(全部由小写字母组成),现在要把它分成两部分,如果分开后的部分是回文串就计算出来它的价值总和,如果不是回文的那么价值就是0,最多能得到的最大价值.   分析:首先的明白这个最大价值有可能是负数,比如下面: -1 -1 -1..... aaa 这样的情况不管怎么分,分出来的串都是回文串,所以得到的最大价值是 -3. 求回文串的算法使用的是Manacher算法,线性的复杂度.   代码如下: =============================================

吉哥系列故事——完美队形II---hdu4513(最长回文子串manacher)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4513 题意比最长回文串就多了一个前面的人要比后面的人低这个条件,所以在p[i]++的时候判断一下s[i-p[i]]<=s[i-p[i]+2]就可以了; 用最长回文串算法manacher:套一下模板就可以了: #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; con