Kodları şöyle:
def manacher(s):
# Ön işleme (# ekleyerek tek ve çift uzunluklu palindromları birleştir)
t = "#" + "#".join(s) + "#"
n = len(t)
p = [0] * n
center = 0
right = 0
max_len = 0
max_center = 0
for i in range(n):
mirror = 2 * center - i
if i < right:
p[i] = min(right - i, p[mirror])
# Palindromu genişlet
while (i - p[i] - 1 >= 0 and
i + p[i] + 1 < n and
t[i - p[i] - 1] == t[i + p[i] + 1]):
p[i] += 1
# Sağ sınır güncelle
if i + p[i] > right:
center = i
right = i + p[i]
# En uzun palindrom
if p[i] > max_len:
max_len = p[i]
max_center = i
# Orijinal stringde başlangıç konumu
start = (max_center - max_len) // 2
return s[start:start + max_len]

