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;

}

 

你可能感兴趣的:(HDU)