HDU 3068

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;
}

Supongo que te gusta

Origin www.cnblogs.com/zgglj-com/p/12663214.html
Recomendado
Clasificación