参考: http://blog.csdn.net/xingyeyongheng/article/details/9310555
题目: HDU3068
// HDU3068.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int longestPdr(vector<char>& vc){
vector<int> rda(vc.size(), 0);
int len = 0;
int i, j, k;
for (i = 1, j = 0; i < vc.size();){
while ((i - j - 1) >= 0 && (i + j + 1) < vc.size() && vc[i - j - 1] == vc[i + j + 1]) ++j;
rda[i] = j;
for (k = 1; k <= j&&rda[i - k] != rda[i] - k; ++k) rda[i + k] = min(rda[i - k], rda[i] - k);
j = max(j - k, 0);
i += k;
}
for (int i = 0; i < rda.size(); ++i) len = max(len, rda[i]);
return len;
}
int _tmain(int argc, _TCHAR* argv[])
{
string str;
while (cin >> str){
vector<char> vc;
for (int pt = 0; pt < str.size(); ++pt){
vc.push_back('#');
vc.push_back(str[pt]);
}
vc.push_back('#');
cout << longestPdr(vc) << endl;
}
return 0;
}
manacher算法原理很简单,对求最长回文字串,用DP和中心向两边扩散的时间复杂度都为O(n^2), manacher类似于中心向两边扩散法,但是又有不同,它利用了回文字串的对称性,把已经求得的回文字串当作求其他回文字串的先验知识,时间复杂度据说是O(n),但是证明起来还是有点困难,说起来不清不白的QAQ....