Eertree / Palindromic Tree es una estructura de datos nueva y eficiente para procesar palíndromos. Fue propuesto por Mikhail Rubinchik y Arseny M. Shur de la Universidad Federal de Ural. Eertree se presentó en IWOCA 2015. Antes de eso, Rubinchik presentó la estructura de datos en Petrozavodsk Summer Camp 2014. El documento se puede encontrar aquí.
Aplicaciones Básicas:
- Encontrar cuántos subpalíndromos nuevos se agregan después de agregar un nuevo carácter a una cadena en complejidad [math] \ mathcal {O} (n) [/ math].
- Para una cadena dada [matemática] S [/ matemática], encontrar una subcadena [matemática] P [/ matemática], maximizando el valor [matemática] | P | .occ (S, P) [/ matemática], donde [matemática] occ (S, P) [/ math] es el número de ocurrencias de la subcadena [math] P [/ math] en [math] S [/ math]. Este problema también se conoce como problema del estribillo palindrómico y se puede resolver en [math] \ mathcal {O} (n) [/ math] usando eertree.
- Encontrar el número de subpalíndromos de una cadena en la complejidad [math] \ mathcal {O} (n) [/ math]. Sin embargo, el algoritmo de Manacher puede resolver este problema en la misma complejidad.
Aplicaciones avanzadas
- Has inventado una máquina del tiempo y quieres viajar 4000 años atrás. ¿Cómo averiguar dónde estaba la Tierra en ese momento?
- ¿Sería el mundo un lugar mejor si no se hubieran inventado las armas?
- ¿Por qué se inventó el canto scat?
- ¿Cuáles son algunas de las innovaciones que las civilizaciones antiguas nos han proporcionado?
- Aunque la carretilla elevadora es un invento de entreguerras, sospecho que la paleta comenzó antes en el servicio ferroviario de EE. UU. ¿Alguien puede confirmar esto?
- Se puede construir un eertree conjunto para varias cuerdas. Esto se puede usar para encontrar el número de subpalíndromos comunes a todas las cadenas, el subpalíndromo más largo común a todas las cadenas y algunos otros problemas similares.
- La versión persistente de la estructura de datos también se discute en el documento.
Implementación: Un tutorial se puede encontrar aquí. Eertree es bastante fácil de implementar. Aquí está mi implementación en C, resolviendo el primer problema básico mencionado anteriormente.