El significado de los problemas
Para una cadena $ s $, encontrar el más largo palindrómica subcadena
solución del problema
Título de la plantilla de caballos vehículos algoritmos. En primer lugar, la cadena de pre-S $ $, cada carácter de la izquierda y la derecha se enchufa en un símbolo especial, como por ejemplo #
el propósito es asegurar que la longitud de cadena es un número impar. Por ejemplo, abc
\ (\ rightarrow \) #a#b#c#
, \ abcd
(\ rightarrow \) #a#b#c#d#
. Al mismo tiempo, con el fin de garantizar $ $, mientras que la circulación no exceda de la frontera , en el comienzo y el final de la cadena después de tratamiento más caracteres especiales no son las mismas necesidades. Por ejemplo, #a#b#c#
\ (\ rightarrow \) @#a#b#c#$
. (Si la declaración es una variable global, no el final de los caracteres especiales de inserción, porque cuando fue declarado, se ha inicializado: 0) y luego hacer $ id: = $ secuencia palindrómica previamente todos han encontrado en el más lejano límite palíndromo cadenas de centros, $ mx: = $ previamente se ha encontrado en todas cadena palíndromo más lejanos límites límites palíndromo cadena. Categoría Discusión:
- \ (I <MX = \) , \ (P [I] = min (MX - + I. 1, P [2 ID * - I]) \) . Desde alrededor de $ $ $ I $ punto de simetría ID J $ $ ( \ (J = 2 * ID - I \) ) la longitud de la secuencia palindrómica se ha conocido, por lo que $ p [i] = p [ j] $ puede ser establecido . Si + p [i] $ i - parte 1> mx $, por lo que más de $ MX $ porción de cadena no puede ser una secuencia palindrómica en $ I $ céntrica. Por eso aquí para tomar $ min $
- \ (I> MX \) , para utilizar de la manera más sencilla de encontrar $ i $ el centro de la cadena más larga palíndromo
Por último, en el proceso de grabación de actualizar el máximo de $ p $ p [I] de $ [i] - línea 1 $
int p[MAXN * 2];
char ma[MAXN * 2];
int Mana(char* s, int n) {
int m = 1;
// inite string s
ma[0] = '@';
for (int i = 0; i < n; ++i) {
ma[m++] = '#';
ma[m++] = s[i];
}
ma[m] = '#';
//printf("%s\n", ma);
int id = 0, mx = 0, ans = 0;
for (int i = 0; i < m; ++i) {
if (i < mx) p[i] = min(mx - i + 1, p[2 * id - i]);
else p[i] = 1;
while(ma[i - p[i]] == ma[i + p[i]]) p[i]++;
if (i + p[i] - 1 > mx) {
id = i;
mx = i + p[i] - 1;
ans = max(ans, p[i] - 1);
}
}
return ans;
}