1089 最长回文子串

1089 最长回文子串 V2(Manacher算法)

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题

回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。

输入一个字符串Str,输出Str里最长回文子串的长度。

Input

输入Str(Str的长度 <= 100000)

Output

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

Input示例

daabaac

Output示例

5

马拉车算法的模板题也算是又进一步理解马拉车算法了.
 1 //马拉车算法
 2 #include <bits/stdc++.h>
 3 #define N 1000000
 4 using namespace std;
 5
 6 int resLen;
 7 int p[N];
 8 int Manacher(string s) {
 9     // Insert ‘#‘
10     string t = "$#";
11     for (int i = 0; i < s.length(); ++i) {
12         t += s[i];
13         t += "#";
14     }
15     // Process t
16     int mx = 0, id = 0, resLen = 0, resCenter = 0;
17     for (int i = 1; i < t.length(); ++i) {
18         //将重复找过的子串直接赋值,多的部分再自行分析
19         p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1;
20         //多的部分自行分析
21         while (t[i + p[i]] == t[i - p[i]])
22             ++p[i];
23
24         //更新最长到达右边的位置并且记录当前位置
25         if (mx < i + p[i]) {
26             mx = i + p[i];
27             id = i;
28         }
29         //更新最长子串长度,以及半径长和当前位置
30         if (resLen < p[i]) {
31             resLen = p[i];
32             // resCenter = i;
33         }
34     }
35     // return s.substr((resCenter - resLen) / 2, resLen - 1);
36     return resLen - 1;
37 }
38
39 string s;
40 int main() {
41     cin>>s;
42     cout<<Manacher(s)<<endl;
43     return 0;
44 }

原文地址:https://www.cnblogs.com/zllwxm123/p/9866036.html

时间: 2024-10-20 18:15:49

1089 最长回文子串的相关文章

51nod 1089 最长回文子串 V2(Manacher算法)

1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. Input 输入Str(Str的长度 <= 100000) Output 输出最长回文子串的长度L. Input示例 daabaac Output示例 5 #include <iostream> #include

【51NOD-0】1089 最长回文子串 V2(Manacher算法)

[算法]回文树 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=100010; struct trees{int len,fail,t[260];}t[maxn]; char s[maxn]; int n,len,l,sz,ans; int getfail(int x) { while(s[len-t[x].len-1]!=s[len])

51nod1089最长回文子串V2

1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. Input 输入Str(Str的长度 <= 100000) Output 输出最长回文子串的长度L. Input示例 daabaac Output示例 5 看到这道题才特意去看了下Manacher算法:参考博客:http://blog.

《算法竞赛入门经典》3.3最长回文子串

1 //例题3-4 2 /* 3 * 输入一个字符串,求出其中最长的回文子串.子串的含义是:在原串中连续出现的字符串片段. 4 *回文的含义是:正看着和倒看着相同,如abba和yyxyy.在判断时,应该忽略所有标点符号和空格 5 *且忽略大小写,但输出应保持原样(在回文串的首部和尾部不要输出多余字符).输入字符长度不超过5000 6 *且占据单独的一行.应该输出最长回文串,如果有多个,输出起始位置最靠左的. 7 *样例输入:Confuciuss say:Madam,I'm Adam. 8 *样例

Manacher算法----最长回文子串

题目描述 给定一个字符串,求它的最长回文子串的长度. 分析与解法 最容易想到的办法是枚举所有的子串,分别判断其是否为回文.这个思路初看起来是正确的,但却做了很多无用功,如果一个长的子串包含另一个短一些的子串,那么对子串的回文判断其实是不需要的.同时,奇数和偶数长度还要分别考虑. Manacher算法可以解决上述问题,并在O(n)时间复杂度内求出结果.下面我们来看一下Manacher算法. 首先,为了处理奇偶的问题,在每个字符的两边都插入一个特殊的符号,这样所有的奇数或偶数长度都转换为奇数长度.比

hihocoder1302 最长回文子串

hihocoder1302 最长回文子串 先贴代码 所有的上面的提示已经交代的好清楚了…… #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <map> #include <queue> #include <sta

[hiho 01]最长回文子串、Manacher算法

题目描述 - 基础方法:枚举子串,判断是否为回文串. - 改进:枚举中间位置,向两侧拓展. - 再改进:利用以前的信息,使得不用每个新位置都从长度1开始拓展. - 优化:将字符串预处理为奇数长度以避免考虑条件分支. - 再优化:开头加入特殊字符避免考虑边界. Manacher 算法: id 是中心点,mx 是其边界.P[i] 表示以 i 为中心的最长回文子串的折半长度. 只要 i < mx, 以 i 为中心的回文子串就可以不必从长度1开始找,而从min{P[j], mx - i}开始(其中j为i

[C++]LeetCode: 99 Longest Palindromic Substring (最长回文子串)

题目: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. 思路:题目要求的s的一个最长回文子串.暴力解决办法就是枚举所有的子串,再对每个子串进行回文判断.进行剪枝,我们考虑可以使用动态规划来避免重复的判

[译]最长回文子串(Longest Palindromic Substring) Part II

[译+改]最长回文子串(Longest Palindromic Substring) Part II 问题:给定字符串S,求S中的最长回文子串. 在上一篇,我们给出了4种算法,其中包括一个O(N2)时间O(1)空间的算法(中心检测法),已经很不错了.本篇将讨论一个O(N)时间O(N)空间的算法,即著名的Manacher算法,并详细说明其时间复杂度为何是O(N). 提示 +BIT祝威+悄悄在此留下版了个权的信息说: 先想想有什么办法能改进中心检测法. 考虑一下最坏的情况.★ 最坏的情况就是各个回文