hdu3068 最长回文

manacher模板题。
这里推荐这篇博文,讲得很清晰,一下就懂了。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char a[220005];
int len, p[220005];
int manacher(){
	int id=0, mx=0, maxlen=0;
	len = len * 2 + 1;
	for(int i=1; i<len; i++){
		if(i<mx)	p[i] = min(p[2*id-i], mx-i);
		else	p[i] = 1;
		while(a[i-p[i]]==a[i+p[i]])	p[i]++;
		if(mx<i+p[i])	mx = i + p[i], id = i;
		maxlen = max(maxlen, p[i]);
	}
	return maxlen;
}
int main(){
	while(scanf("%s", a)!=EOF){
		len = strlen(a);
		for(int i=len; i>=0; i--){
			a[2*i+2] = a[i];//为了让''也过去
			a[2*i+1] = '#';
		}
		a[0] = '$';
		printf("%d
", manacher()-1);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/poorpool/p/7911762.html