最长回文子串 - Manacher算法
2017-05-29 21:14
495 查看
测试:HDU-3068
讲解:Manacher
Manacher算法可以在 O(n) 的时间内解决最长回文子串的问题。
思想还是比较简单的,难在复杂度的证明上,似乎也找不到比较好的证明。
不过根据随机样例测试发现for内的while循环执行次数在 n 左右。
讲解: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; }
相关文章推荐
- Manacher算法: 最长回文子串O(N)时间内求解
- hdu【最长回文子串——Manacher算法】POJ 3974/HDU 3068
- manacher算法求最长回文子串(Longest Palindromic Substring)
- hihocoder 1032 最长回文子串 (Manacher算法 详解+模板)
- Manacher算法 - 最长回文子串
- hihoCoder #1032 : 最长回文子串 - (Manacher算法)
- hihocoder 1032, 最长回文子串, manacher算法
- O(N)最长回文子串算法——Manacher算法
- 最长回文子串-Manacher算法(详解)
- 算法——Manacher算法(求最长回文子串)
- 最长回文子串——Manacher算法
- 51Nod - 1089 最长回文子串 V2(Manacher算法)
- 最长回文子串:Manacher算法[转]
- 最长回文子串与Manacher算法
- 最长回文子串--轻松理解Manacher算法
- 51nod1089 最长回文子串 manacher算法
- 夕拾算法进阶篇:11)最长回文子串(Manacher算法)
- 最长回文子串—动态规划和Manacher算法(0(n)时间复杂度
- HiHo 1032 最长回文子串 (Manacher算法求解)
- LeetCode5. Longest Palindromic Substring(最长回文子串:Manacher算法)