1089 最长回文子串

基准时间限制: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 }

 

posted @ 2018-10-28 16:31  #忘乎所以#  阅读(123)  评论(0编辑  收藏  举报