# Manacher's Algorithm in c++

## Introduction:

Palindromes, fascinating sequences that read the same backward as forward, have captivated the minds of mathematicians and computer scientists alike. Identifying palindromic substrings efficiently is a common challenge in computer science. Manacher's Algorithm, a groundbreaking technique developed by computer scientist Glenn Manacher, provides an elegant solution to this problem.

## Understanding the Problem:

Given a string, the task is to find the longest palindromic substring within it. Brute-force solutions might involve checking all possible substrings for palindromic properties, but this approach is computationally expensive, especially for large strings. Manacher's Algorithm, on the other hand, achieves linear time complexity, making it a powerful tool for palindromic substring detection.

## Manacher's Algorithm Overview:

Manacher's Algorithm aims to find the longest palindromic substring in a given string. Unlike other algorithms, Manacher's is specifically designed to handle both odd and even-length palindromes efficiently. The algorithm takes advantage of the symmetry properties of palindromes to reduce the time complexity.

The key insight behind Manacher's Algorithm is the concept of "centers" and their associated "palindromic spans." A center is a position in the string, and the palindromic span is the distance from the center to the outermost character of the palindrome centered at that position. Manacher's Algorithm avoids redundant computations by utilizing information from previously processed parts of the string.

## How Manacher's Algorithm Works:

Manacher's Algorithm uses a combination of dynamic programming and clever observations to find the longest palindromic substring. The key idea is to maintain information about the palindrome properties of substrings already processed.

Here are the main steps of Manacher's Algorithm:

Preprocessing the String:

• Insert special characters (usually '#' or '\$') between each pair of characters in the string to handle both even and odd-length palindromes.
• This step helps in dealing with palindromes of both odd and even lengths uniformly.

Maintaining Palindrome Information:

• Maintain an array (usually called P) to store information about the palindrome properties of substrings.
• Initialize the array with zeros.

Finding Palindromes:

• Iterate through each character in the modified string.
• For each character, determine its palindrome length by considering symmetry and previously computed values.

Finding the Longest Palindrome:

• Track the maximum palindrome length and its center during the iteration.
• Use this information to extract the longest palindromic substring.

### Implementation:

Explanation:

• The program starts by transforming the input string s into a new string T by inserting '#' characters between each pair of characters in the original string.
• The program initializes variables such as n (length of the transformed string T), a vector P to store the length of the palindrome centered at each position, and two variables C and R to represent the center and right boundary of the currently known palindrome.
• The program iterates through each character in the transformed string T. For each character, it attempts to expand the palindrome centered at that position. It uses the information from previously computed palindromes to optimize the calculation.
• If the palindrome centered at the current position expands beyond the right boundary (R), the program updates the center (C) and right boundary (R) accordingly. This ensures that the algorithm efficiently skips unnecessary comparisons by utilizing the symmetry properties of palindromes.
• After processing all characters in the transformed string, the program finds the maximum element in the vector P.
• It identifies the center index and calculates the start index of the longest palindromic substring.

Program Output:

## The Need for Manacher's Algorithm:

The brute-force approach to finding the longest palindromic substring involves checking every possible substring to see if it's a palindrome. However, this method has a time complexity of O(n^3) and is impractical for large strings.

Manacher's Algorithm improves upon this by taking advantage of the symmetry properties of palindromes. It processes each character in the string only once, resulting in a linear time complexity of O(n).

## Conclusion:

In conclusion, Manacher's Algorithm in C++ stands out as a powerful and efficient solution for the problem of finding the longest palindromic substring in a given string. The algorithm's ability to achieve linear time complexity makes it particularly appealing for large-scale applications where performance is crucial. By cleverly exploiting the properties of palindromes, Manacher's Algorithm eliminates redundant computations, resulting in a faster and more optimized solution compared to other traditional approaches.

Furthermore, the implementation of Manacher's Algorithm in C++ showcases the elegance and versatility of the language in expressing complex algorithms concisely. The code's clarity and readability contribute to its accessibility, making it easier for developers to understand and modify as needed. Additionally, the use of standard C++ constructs and libraries enhances the algorithm's portability and integration into diverse software projects.