#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
using namespace std;
const int maxn = 220005;
char str[maxn];
int p[maxn];
void manacher(char *s, int len) {
p[0] = 1;
int mmax = 0, id = 0;
for (int i = 1; i < len; i ++) {
p[i] = mmax > i ? min(p[id * 2 - i], mmax - 1) : 1;
while (s[i + p[i]] == s[i - p[i]]) p[i] ++;
if (i + p[i] > id + p[id]) {
id = i;
mmax = i + p[i];
}
}
}
int main()
{
while (~scanf("%s", str)) {
int len = strlen(str);
for (int i = len; i >= 0; i --) {
str[(i << 1) + 1] = '#';
str[(i << 1) + 2] = str[i];
}
str[0] = '*';
len = len * 2 + 2;
manacher(str, len);
int ans = 0;
for (int i = 0; i < len; i ++) {
ans = max(ans, p[i] - 1);
}
printf("%d\n", ans);
}
return 0;
}
求最长回文子串长度 manacher算法
最新推荐文章于 2023-12-25 16:13:31 发布
本文介绍了一个使用Manacher算法求解最长回文子串问题的C++实现。通过预处理字符串并利用已知的回文特性来减少计算量,该算法能够高效地找到给定字符串中的最长回文子串。代码中详细展示了如何进行边界检查和更新最大回文半径的过程。
508

被折叠的 条评论
为什么被折叠?



