题目链接
给出一个只由小写英文字符a,b,c…y,z组成的字符串S,求S中最长回文串的长度.
板子:
#include <bits/stdc++.h>
using namespace std;
const int N=111000000+10;
#define end '\n'
#define IOS ios::sync_with_stdio(0)
int n,hw[N],ans;
char a[N],s[N*2];//因为要插入字符所以*2,空间限制也很安全
void fun() {
s[0] = s[1] = '#';
for (int i = 0; i < n; i++) {
s[i * 2 + 2] = a[i];
s[i * 2 + 3] = '#';
}
n = n * 2 + 2;
s[n] = 0;
}
void manacher() {
int max_r = 0, mid;
for (int i = 1; i < n; i++) {
if (i < max_r) {
hw[i] = min(hw[2 * mid - i], hw[mid] + mid - i);//划重点
} else {
hw[i] = 1;
}
for (; s[i + hw[i]] == s[i - hw[i]]; hw[i]++); //继续扩展
if (hw[i] + i > max_r) {
max_r = hw[i] + i;//更新
mid = i;
}
}
}
int main() {
scanf("%s", a);
n = strlen(a);
fun();
manacher();
ans = 1;
for (int i = 0; i < n; i++) {
ans = max(ans, hw[i]);
}
printf("%d\n", ans - 1);
return 0;
}