Encontrando Similitudes


Submit solution


Points: 100 (partial)
Time limit: 1.0s
Java 8 3.0s
Python 3.0s
Memory limit: 128M
Java 8 512M
Python 512M

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

Rafael es un niño de primaria y este curso aprendió a escribir. Sus profesores le han enseñado el alfabeto latino y lo han motivado a practicar la escritura de palabras a lápiz y papel. Como Rafael es muy pequeño las palabras que escribe generalmente no tienen mucho sentido y, curiosamente, siempre siguen la misma regla: empieza a escribir letras que conoce y cuando se aburre concatena al final una cantidad arbitraria de veces la palabra con la que se aburrió. O sea, si Rafael se aburre en la palabra "asa"podría dejar de escribir en las palabras "asaasa", "asaasaasa", y así sucesivamente.

Sucede que Rafael es un poco olvidadizo y a cada rato tiene que averiguar cuál fue la palabra que usó en las concatenaciones para obtener aquella que tiene escrita en el papel. Al ser tan joven e inexperto, se siente frustrado al no encontrarla pero él sabe que eres más que capaz de resolver su problema y, por eso, ruega tu ayuda. Te cuenta que cree que pueden haber varias palabras que cumplan sus requisitos, a pesar que él no encontró palabra alguna, por lo que te pide una lista con todas las palabras que puedan generar la escrita en el papel para así poder buscar la original con más facilidad.

Entrada

La primera línea de la entrada contiene un entero n\,(2 \leq n \leq 10^5) que representa la longitud de la palabra final s con la que termina Rafael en su hoja. La próxima y última línea es la palabra s, escrita usando letras minúsculas del alfabeto latino.

Salida

La salida cuenta con dos líneas. En la primera línea se espera un número que denota la cantidad de palabras que cumplen las restricciones de Rafael y en la segunda línea se requiere la lista de longitudes de las palabras seleccionadas estando los elementos de la lista ordenados de menor a mayor y separados por espacio.

Ejemplos

Entrada 1
6
asaasa
Salida 1
1
3
Entrada 2
20
aaaaaaaaaaaaaaaaaaaa
Salida 2
5
1 2 4 5 10

Restricción

n \leq 1\,000 para el 10% de los casos.


Comments


  • 0
    Mauricio  commented on Feb. 18, 2024, 5:54 p.m. edited

    .


  • -3
    Primervirgen  commented on Aug. 16, 2019, 10:18 p.m.

    Que algoritmo c puede implementar aquí?


    • 4
      aniervs  commented on Aug. 19, 2019, 11:31 a.m.

      Obviamente, para que un string p se pueda concatenar varias veces él mismo obteniendo un string S, el tamaño de p debe ser divisor del tamaño de S. Entonces, si N es el tamaño del string de la entrada, iteramos por los prefijos cuyos tamaños sean divisores de N, y al estar en un prefijo de tamaño D, iteramos por los N/D segmentos de tamaño D del string y comprobamos si son iguales al prefijo de tamaño D (lo que se puede hacer con rolling Hashing); si todos son iguales, añadimos D a la solución.


  • 1
    angelmh  commented on Feb. 15, 2018, 9:18 p.m.

    Hola, tengo una duda, pueden mencionarme que algoritmo para búsqueda de patrones es más eficiente que el KMP??? este problema lo hice con tal método y me da Tiempo Límite Excedido en java.


    • 1
      dcordb  commented on Feb. 16, 2018, 2:15 a.m.

      Se incrementó el tiempo límite de Java y Python a 3 segs.