PAT--1040 Longest Symmetric String--马拉车

题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805446102073344

题目大意:求给定回文串的最长回文串的长度

分析:马拉车模板题

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 1e4 + 5;
int len, p[N];
string s, str;
void init() {
	len = s.length();
	str = "";
	str += "$";
	for(int i = 0; i < len; i++) {
		str += "#";
		str += s[i];
	}
	str += "#";
	len = str.length();
}
int manacher() {
	int sum = 0, mx = 0, id;
	for(int i = 1; i < len; i++) {
		p[i] = mx > i ? min(mx - i, p[2 * id - 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() {
	getline(cin, s);
	init();
	printf("%d\n", manacher());
	return 0;
}
发布了150 篇原创文章 · 获赞 4 · 访问量 6952

猜你喜欢

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