您的位置:首页 > 其它

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

2017-04-26 14:28 302 查看
1089 最长回文子串 V2(Manacher算法)

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

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

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

Input

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

Output

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

Input示例

daabaac

Output示例

5

思路:Manacher算法,线性匹配

英文解释:https://zhuhongcheng.wordpress.com/2009/08/02/a-simple-linear-time-algorithm-for-finding-longest-palindrome-sub-string/

中文解释:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824

代码:

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
string str;
int p[1000005];
void mlc(int n){
int mx,id;
mx=0;id=0;
for(int i=1;i<n;i++){
if(mx>i){
p[i]=min(p[id*2-i],mx-i);
}
else
p[i]=1;

while(str[i-p[i]]==str[i+p[i]])
p[i]++;

if(i+p[i]>mx){
mx=i+p[i];
id=i;
}

}

}

int main(){
string s;
cin>>s;

str+='*';
str+='#';
for(int i=0;i<s.length();i++){
str+=s[i];
str+='#';

}
int l=str.length();
mlc(l);
int max=-1;
for(int i=1;i<l;i++){
if(p[i]>max)
max=p[i];
}
cout<<max-1<<endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: