解决问题

求最长回文子串的长度

Manacher.pdf

AcWing 3188. manacher算法

给定一个长度为 nn 的由小写字母构成的字符串,求它的最长回文子串的长度是多少。
输入格式
一个由小写字母构成的字符串。
输出格式
输出一个整数,表示最长回文子串的长度。
数据范围
1≤n≤107
输入样例:
abcbabcbabcba
输出样例:
13

  1. import java.util.*;
  2. public class Main {
  3. static final int N = 20000010;
  4. static char[] a, b = new char[N];
  5. static int[] p = new int[N];
  6. static int n;
  7. public static void main(String[] args) {
  8. Scanner sc = new Scanner(System.in);
  9. a = sc.next().toCharArray();
  10. n = init();
  11. manacher();
  12. int res = 0;
  13. for (int i = 0; i < n; i++)
  14. res = Math.max(res, p[i]);
  15. System.out.println(res - 1);
  16. }
  17. static void manacher() {
  18. int mid = 0, r = 0;
  19. for (int i = 1; i < n; i++) {
  20. if (i < r) p[i] = Math.min(p[mid * 2 - i], r - i);
  21. else p[i] = 1;
  22. while (b[i + p[i]] == b[i - p[i]]) {
  23. p[i]++;
  24. }
  25. if (r < p[i] + i) {
  26. r = p[i] + i;
  27. mid = i;
  28. }
  29. }
  30. }
  31. static int init() {
  32. int k = 0;
  33. b[k++] = '$';
  34. b[k++] = '#';
  35. for (char c : a) {
  36. b[k++] = c;
  37. b[k++] = '#';
  38. }
  39. b[k++] = '^';
  40. return k;
  41. }
  42. }