基准时间限制:1 秒 空间限制:131072 KB 分值: 0
难度:基础题
回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。
输入一个字符串Str,输出Str里最长回文子串的长度。
Input
输入Str(Str的长度 <= 100000)
Output
输出最长回文子串的长度L。
Input示例
daabaac
Output示例
5
思路:纯粹的Manacher算法题。
code:
#include<iostream>
using namespace std;
const int MAX_N=200050;
int n=0;
int len[MAX_N];
char a[MAX_N];
int Manacher_(char a[]);
int Manacher(char a[]);
int main()
{
ios::sync_with_stdio(false);
string str;
cin>>str;
for(int i=0;i<str.size();++i)
a[n++]='#',a[n++]=str[i];
a[n++]='#';
// cout<<Manacher_(a)<<endl;
cout<<Manacher(a)<<endl;
return 0;
}
int Manacher_(char a[])
{
int ans=1,p=0,l=0,r=0;
for(int i=0;i<n&&r<n;++i)
if(i<r){
int li=2*p-i;
if(len[li]<r-i) len[i]=len[li];
else{
l=2*i-r; p=i;
while(l>=0&&r<n){
if(a[l]==a[r]){
l--; r++;
}else break;
}
len[i]=r-p;
ans=max(ans,len[i]);
}
}else{
p=l=r=i;
while(l>=0&&r<n){
if(a[l]==a[r]){
l--; r++;
}else break;
}
len[i]=r-p;
ans=max(ans,len[i]);
}
return ans-1;
}
int Manacher(char a[]) //代码长度优化
{
int ans=1,p=0,l=0,r=0;
for(int i=0;i<n&&r<n;++i)
if(i<r&&len[2*p-i]<r-i) len[i]=len[2*p-i];
else{
if(i<r&&len[2*p-i]>=r-i){
l=2*i-r; p=i;
}else p=l=r=i;
while(l>=0&&r<n){
if(a[l]==a[r]){
l--; r++;
}else break;
}
len[i]=r-p;
ans=max(ans,len[i]);
}
return ans-1;
}