Palíndromo


Submit solution

Points: 100 (partial)
Time limit: 1.0s
Memory limit: 64M

Author:
Problem type
Allowed languages
Ada, Assembly, Awk, BrainF***, C, C#, C++, Dart, Go, Java, JS, Kotlin, Lua, Pascal, Perl, Prolog, Python, Scala, Swift, VB

Dado una cadena S de letras mayúsculas, se te permite realizar cualquier cantidad (incluyendo 0) de las siguientes operaciones (y en el orden que desees):

  • Borrar una letra de cualquier posición
  • Intercambiar dos letras en posiciones adyacentes

¿Cuál es el palíndromo más largo que puedes formar?

Un palíndromo es una cadena de caracteres que se lee igual de izquierda a derecha como de derecha a izquierda.

Entrada

La primera línea de entrada consiste en un solo número entero \(T (1 \le T \le 100)\) indicando el número de casos de prueba a procesar.

Cada caso de prueba consiste en dos líneas:

  • Línea 1 contiene un solo número entero \(N (1 \le N \le 1000)\), que representa la longitud de la cadena S.
  • Línea 2 consiste en la cadena S, la cual contiene exactamente N letras, todas en mayúsculas.

Salida

Por cada caso de prueba, en el mismo orden dado por la entrada, imprime el palíndromo más largo que puedes obtener luego de aplicar cualquier cantidad de las operaciones descritas. Si existen varios palíndromos que cumplen con las condiciones dadas, imprime el más pequeño en orden lexicográfico. Una cadena S es lexicográficamente más pequeño que otra cadena T si el caracter en la posición i de S es más pequeño que el caracter en la misma posición i de T donde i es la primera posición donde las dos cadenas difieren.

Ejemplo de entrada

4
4
NOON
5
MADAM
3
ABC
8
XXXZZZYY

Ejemplo de salida

NOON
AMDMA
A
XYZXZYX

Comments


  • 0
    linkyless  commented on Jan. 7, 2024, 5:38 p.m.

    Comentaré mi solución-idea, alerta de spoiler:

    Como sabemos que un palíndromo es una cadena que se lee igual de izquierda a derecha que de derecha a izquierda, esto significa también que los caracteres de la cadena deben ser simétricos respecto al centro de la misma. O sea, si la cadena tiene una longitud par, los caracteres deben aparecer en pares iguales a ambos lados del centro, pero si la cadena tiene una longitud impar, los caracteres deben aparecer en pares iguales a ambos lados del centro, excepto uno que puede aparecer solo en el centro. Puedes comprobarlo rápidamente escribiendo una que otra cadena palíndrome.

    Por ejemplo, la cadena ABBA es un palíndromo de longitud par (N = 4), y los caracteres A y B aparecen en pares iguales a ambos lados del centro. La cadena ABCBA es un palíndromo de longitud impar, y los caracteres A y B aparecen en pares iguales a ambos lados del centro, pero eso sí, el carácter C aparece solo en el centro.

    Esto nos da una pista de cómo construir el palíndromo más largo que se puede formar: usar la mayor cantidad posible de caracteres que aparezcan un número par de veces en la cadena, y si hay algún carácter que aparezca un número impar de veces, podemos usar uno de ellos en el centro. Para ello se debe contar la frecuencia de cada carácter en la cadena, y ya luego usar la mitad de cada carácter que tenga una frecuencia par, y uno de los caracteres que tenga una frecuencia impar, si es que existe. El orden de los caracteres no importa, siempre que se mantenga la simetría, pero si queremos el palíndromo más pequeño en orden lexicográfico, debemos usar los caracteres en orden alfabético.


  • 1
    elRubiusOMG  commented on Jan. 28, 2020, 1:59 p.m.

    Esto es Hashing????


    • 3
      aniervs  commented on Jan. 28, 2020, 3:22 p.m.

      No es necesario, fíjate que como te permiten cambiar el orden de las letras al final lo importante es cuántas veces se repite cada letra. En una palabra palindrome hay a lo sumo una letra que se repite una cantidad Impar de veces, (esto solo pasa en caso de q la palabra palindrome sea de longitud impar). Ya con esto puedes llegar a la solución fácilmente.