HDU 3068--马拉车

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068

题目大意:求给定字符串的最长回文子串

分析:马拉车模板题

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 110010;
int len, p[2 * N];
char s[N], str[2 * N];
void init() {
	len = strlen(s);
	int k = 0;
	str[k++] = '$';
	for(int i = 0; i < len; i++) {
		str[k++] = '#';
		str[k++] = s[i];
	}
	str[k++] = '#';
	len = k;
}
int manacher() {
	int sum = 0, mx = 0, id;
	for(int i = 1; i < len; i++) {
		if(i < mx) p[i] = min(mx - i, p[2 * id - i]);
		else p[i] = 1;
		while(str[i - p[i]] == str[i + p[i]]) p[i]++;
		if(p[i] + i > mx) {
			mx = p[i] + i;
			id = i;
		}
		sum = max(sum, p[i] - 1);
	}
	return sum;
}
int main() {
	while(~scanf("%s", s)) {
		init();
		printf("%d\n", manacher());
	}
	return 0;
}
发布了150 篇原创文章 · 获赞 4 · 访问量 6967

猜你喜欢

转载自blog.csdn.net/Napom/article/details/100748803