Editorial for Casos de Prueba
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Resolví este problema usando hashing. El hashing puede fallar en algunos casos y existen algunos trucos para disminuir la probabilidad de que esto pase. De todas formas, mi solución pasó los  =P.
Siendo las cadenas de la entrada . Podemos construir la solución más pequeña permutando las cadenas y luego tratando de 'unirlas' una a la otra. Para dos cadenas 
 y 
, necesitamos encontrar el segmento más largo que se solapa entre el final de la cadena 
 y el inicio de la cadena 
. La fuerza bruta obvia no dará en tiempo. Sin embargo, podemos usar hashing para calcular el resultado en 
, donde 
 es 
. La función de hashing que usé es la polinomial 
. Esto nos ofrece la oportunidad de calcular el valor de hash de cualquier subsequiencia de la cadena en tiempo 
.
Entonces, podemos intentar todas las permutaciones de  e intentar 'unir' las cadenas adyacentes eliminando los segmentos que se solapan entre estas utilizando la idea anterior explicada.
Existe un último caso: si  es una substring de 
 para cualquier 
, entonces simplemente podemos ignorar 
. Podemos usar hashing para revisar si una cadena está contenida dentro de otra.
Comments