let manacher s =
  let n = String.length s in
  let m = 2 * n + 1 in
  let t = Array.make m '#' in
  for i = 0 to n - 1 do
    t.(2 * i + 1) <- s.[i]
  done;
  let p = Array.make m 0 in
  let center = ref 0 and right = ref 0 in
  let max_p = ref 0 in
  for i = 0 to m - 1 do
    let mirror = 2 * !center - i in
    if i < !right then begin
      let v = !right - i in
      let pm = p.(mirror) in
      p.(i) <- if pm < v then pm else v
    end;
    while i + p.(i) + 1 < m && i - p.(i) - 1 >= 0
          && t.(i + p.(i) + 1) = t.(i - p.(i) - 1) do
      p.(i) <- p.(i) + 1
    done;
    if i + p.(i) > !right then begin
      center := i;
      right := i + p.(i)
    end;
    if p.(i) > !max_p then max_p := p.(i)
  done;
  !max_p

;;

manacher "babadaba"
