解决问题
求最长回文子串的长度
AcWing 3188. manacher算法
给定一个长度为 nn 的由小写字母构成的字符串,求它的最长回文子串的长度是多少。
输入格式
一个由小写字母构成的字符串。
输出格式
输出一个整数,表示最长回文子串的长度。
数据范围
1≤n≤107
输入样例:
abcbabcbabcba
输出样例:
13
import java.util.*;
public class Main {
static final int N = 20000010;
static char[] a, b = new char[N];
static int[] p = new int[N];
static int n;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
a = sc.next().toCharArray();
n = init();
manacher();
int res = 0;
for (int i = 0; i < n; i++)
res = Math.max(res, p[i]);
System.out.println(res - 1);
}
static void manacher() {
int mid = 0, r = 0;
for (int i = 1; i < n; i++) {
if (i < r) p[i] = Math.min(p[mid * 2 - i], r - i);
else p[i] = 1;
while (b[i + p[i]] == b[i - p[i]]) {
p[i]++;
}
if (r < p[i] + i) {
r = p[i] + i;
mid = i;
}
}
}
static int init() {
int k = 0;
b[k++] = '$';
b[k++] = '#';
for (char c : a) {
b[k++] = c;
b[k++] = '#';
}
b[k++] = '^';
return k;
}
}