dsa2 min read

Manacher's Algorithm from Scratch (2026)

Manacher's Algorithm from Scratch (2026)

Published:  |  Category: Dsa  |  Reading time: ~15 min
Manacher's Algorithm from Scratch (2026)

Manacher's algorithm finds the longest palindromic substring in O(n) time by exploiting the symmetric nature of palindromes. It processes the string character by character, maintaining the center and right boundary of the current rightmost palindrome.

By inserting separators between characters (e.g., '|'), the algorithm handles both odd and even length palindromes uniformly, reducing both cases to odd-length palindrome expansion.

📖 Table of Contents
  1. Manacher's Algorithm Implementation

Manacher's Algorithm Implementation

The algorithm maintains an array P where P[i] stores the palindrome radius at position i in the transformed string. Using the mirror property, P[i] is initialized based on its symmetric counterpart within the current palindrome boundary.

Explicit expansion occurs when the mirror-based estimate reaches or exceeds the right boundary, ensuring correct radii are computed while maintaining linear time.

string manacher(string s) {
    string T = "|";
    for (char c : s) T += c, T += '|';
    int n = T.size();
    vector P(n, 0);
    int center = 0, right = 0;
    for (int i = 1; i < n - 1; i++) {
        if (i < right)
            P[i] = min(P[2 * center - i], right - i);
        while (T[i + P[i] + 1] == T[i - P[i] - 1])
            P[i]++;
        if (i + P[i] > right)
            center = i, right = i + P[i];
    }
    int maxLen = 0, idx = 0;
    for (int i = 1; i < n - 1; i++)
        if (P[i] > maxLen) maxLen = P[i], idx = i;
    return s.substr((idx - maxLen) / 2, maxLen);
}

Frequently Asked Questions

How does Manacher's achieve O(n) time?

Each intra-palindrome comparison uses cached mirror values. Explicit character expansion only happens when the palindrome extends beyond the current right boundary, which moves monotonically forward, limiting total comparisons to O(n).

Why insert separators between characters?

Separators ('|') transform the string so every palindrome has odd length in the transformed string, eliminating separate handling of even-length palindromes. The original palindrome length equals the radius in the transformed string.

Originally published on Ayodhyyya. Last updated June 1, 2026.