您的位置:首页 > 其它

最长回文子串 - Manacher算法

2017-05-29 21:14 495 查看
测试:HDU-3068

讲解:Manacher

Manacher算法可以在 O(n) 的时间内解决最长回文子串的问题。

思想还是比较简单的,难在复杂度的证明上,似乎也找不到比较好的证明。

不过根据随机样例测试发现for内的while循环执行次数在 n 左右。

#include<bits/stdc++.h>
using namespace std;
const int N=110007;
int p[N*2];
int totalAccess;
int Manacher(const string & s)
{
int res=0;
int id;
int mx=0;
for(int i=0;i<s.length();i++)
{
if(i<mx) p[i]=min(p[id*2-i],mx-i+1);
else p[i]=1;
while(i-p[i]>=0&&i+p[i]<s.length()&&s[i-p[i]]==s[i+p[i]]) ++p[i],++totalAccess;
if(mx<i+p[i]-1)
{
id=i;
mx=i+p[i]-1;
}
res=max(res,p[i]-1);
}
return res;
}
int main()
{
//freopen("in.txt","r",stdin);
ios::sync_with_stdio(false);
string s;
while(cin>>s)
{
totalAccess=0;
string t;
t.push_back('#');
for(int i=0;i<s.length();i++)
{
t.push_back(s[i]);
t.push_back('#');
}
cout << Manacher(t) << endl;
//clog << totalAccess << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: