Algoritmo de Manacher (algoritmo para encontrar substring de palíndromo mais longo em tempo linear)

Depois de passar cerca de 6-8 horas tentando digerir o algoritmo do Manacher, estou pronto para jogar a toalha. Mas antes que eu faça, aqui está um último tiro no escuro: alguém pode explicar isso? Eu não me importo com o código. Eu quero alguém para explicar oALGORITMO.

Aqui parece ser um lugar que os outros pareciam gostar de explicar o algoritmo:http://www.leetcode.com/2011/11/longest-palindromic-substring-part-ii.html

Eu entendo porque você iria querer transformar a string, digamos, 'abba' em # a # b # b # a # Depois do que eu estou perdido. Por exemplo, o autor do site mencionado anteriormente diz que a parte principal do algoritmo é:

<code>                      if P[ i' ] ≤ R – i,
                      then P[ i ] ← P[ i' ]
                      else P[ i ] ≥ P[ i' ]. (Which we have to expand past 
                      the right edge (R) to find P[ i ])
</code>

Isso parece errado, porque ele diz em um ponto que P [i] é igual a 5 quando P [i '] = 7 e P [i] não é menor ou igual a R - i.

Se você não está familiarizado com o algoritmo, aqui estão mais alguns links:http://tristan-interview.blogspot.com/2011/11/longest-palindrome-substring-manachers.html (Eu tentei este, mas a terminologia é horrível e confusa. Primeiro, algumas coisas não estão definidas. Além disso, muitas variáveis. Você precisa de uma lista de verificação para lembrar qual variável está se referindo a quê.)

Outra é:http://www.akalin.cx/longest-palindrome-linear-time (boa sorte)

A essência básica do algoritmo é encontrar o palíndromo mais longo em tempo linear. Isso pode ser feito em O (n ^ 2) com uma quantidade mínima a média de esforço. Este algoritmo é suposto ser "inteligente" para descer para O (n).

questionAnswers(8)

yourAnswerToTheQuestion