HDU3068 最长回文 Manacher算法

Manacher算法是O(n)求最长回文子串的算法,其原理很多别的博客都有介绍,代码用的是clj模板里的,写的确实是异常的简洁,现在的我只能理解个大概,下面这个网址的介绍比较接近于这个模板,以后再好好理解,我现在先放一放

http://www.starvae.com/?p=212

#pragma warning(disable:4996)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;

void palindrome(char cs[], int len[], int n) { //len[i] means the max palindrome length centered i/2
	for (int i = 0; i < n * 2; ++i) {
		len[i] = 0;
	}
	for (int i = 0, j = 0, k; i < n * 2; i += k, j = max(j - k, 0)) {
		while (i - j >= 0 && i + j + 1 < n * 2 && cs[(i - j) / 2] == cs[(i + j + 1) / 2])
			j++;
		len[i] = j;
		for (k = 1; i - k >= 0 && j - k >= 0 && len[i - k] != j - k; k++) {
			len[i + k] = min(len[i - k], j - k);
		}
	}
}

char str[120000];
int tlen[240000];
int n;

int main()
{
	while (~scanf("%s", str))
	{
		palindrome(str, tlen, strlen(str));
		int ans = 0;
		int mxlen = strlen(str);
		for (int i = 0; i < 2 * mxlen; i++){
			ans = max(ans, tlen[i]);
		}
		printf("%d\n", ans);
	}
	return 0;
}

 

posted @ 2014-02-23 13:36  chanme  阅读(175)  评论(0编辑  收藏  举报