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"