¿Alguien puede explicar la solución del problema LabelMaker de Hacker Cup de Facebook?

EDITAR:
En cuanto a su declaración actual de la pregunta, esa oración se relaciona con la diferencia que surge de la indexación basada en 0 y la indexación basada en 1.
‘A’, para nuestra comprensión de la analogía, es 0, pero de acuerdo con el esquema de etiquetado de la pregunta, debe ser 1 y, de manera similar, ‘B’ debe ser 2 y no 1.
Entonces, para abordar esto, la solución de Facebook reduce n en 1 antes del comienzo de cada ciclo.


Comencemos con un ejemplo: EHT 34

Todos los personajes que tenemos son E, H y T.

Hacer etiquetas en el orden descrito:

Longitud = 1:
EHT

Longitud = 2:
EE EH ET HE HH HT TE TH TT

Longitud = 3:
EEE EEH EET EHE …

Entonces entiendes que si estamos viendo la longitud [matemática] i [/ matemática], entonces el número total de tales cadenas es [matemática] a ^ i [/ matemática].

Ahora, si la longitud no cambiara, entonces se puede encontrar fácilmente [math] i [/ math] th string.

Considere AB como nuestra cadena, y longitud = 3

tenemos las siguientes combinaciones

Cadena Binario Decimal

AAA 000 0
AAB 001 1
ABA 010 2
ABB 011 3
BAA 100 4
BAB 101 5
BBA 110 6
BBB 111 7

El parecido se puede apreciar de inmediato.

Para los caracteres disponibles ABC y longitud = 3, tenemos

String Base-3 Decimal

AAA 000 0
AAB 001 1
AAC 002 2
ABA 010 3
ABB 011 4
… y así

Entonces podemos hacerlo al revés para llegar a la cadena.

Para encontrar la tercera cadena, convertimos 3 a base-3, es decir, 010 y reemplazamos los caracteres de forma analógica para obtener el resultado ABA

Ahora, todo lo que queda es encontrar la longitud de [math] i [/ math] th string de antemano.

Esto se puede hacer utilizando nuestra observación inicial.

  f = abierto ("F: \\ hackerCup \\ labelmaker.txt")
 w = abierto ("F: \\ hackerCup \\ labelmaker_out.txt", 'w')
 t = int (f.readline ())
 para T en xrange (1, t + 1):
     w.write ("Caso #" + str (T) + ":")
     caracteres, n = f.readline (). split ()
     n = int (n)
     si n == 1:
         caracteres de impresión
         continuar
     av = len (caracteres) #av es el número de caracteres disponibles
     l = 1 #l será la longitud de la enésima cadena      
     lim = av
     mientras n> lim:  
         n- = lim
         l + = 1
         lim * = av        
     n- = 1
     ans = ''
     para _ en xrange (l):
         ans = chars [n% av] + ans #conversión a base 'av' y reemplazo
         n / = av
     w.write (ans + '\ n')
 w.close ()
 f.close ()
    

Lo que intentan decir es que las etiquetas son cadenas binarias, es decir, su valor es igual a:
[matemática] digit_ {0} * 2 ^ {0} + digit_ {1} * 2 ^ {1} + digit_ {2} * 2 ^ {2} +… [/ math]

donde [math] digit_ {i} [/ math] es igual a 1 si el carácter correspondiente es A, y 2 si el carácter correspondiente es B (en lugar de 0 y 1 en binario normal).

Veamos las primeras etiquetas:
[matemáticas] A = 1 * 2 ^ {0} = 1 [/ matemáticas]
[matemáticas] B = 2 * 2 ^ {0} = 2 [/ matemáticas]
[matemáticas] AA = 1 * 2 ^ {1} + 1 * 2 ^ {0} = 3 [/ matemáticas]
[matemáticas] AB = 1 * 2 ^ {1} + 2 * 2 ^ {0} = 4 [/ matemáticas]
[matemáticas] BA = 2 * 2 ^ {1} + 1 * 2 ^ {0} = 5 [/ matemáticas]
[matemáticas] BB = 2 * 2 ^ {1} + 2 * 2 ^ {0} = 6 [/ matemáticas]
[matemáticas] AAA = 1 * 2 ^ {2} + 1 * 2 ^ {1} + 1 * 2 ^ {0} = 7 [/ matemáticas]

Espero que esté claro 🙂

More Interesting

¿Qué es un algoritmo eficiente para encontrar un circuito euleriano en un gráfico no dirigido?

¿Qué son los algoritmos gráficos?

¿Qué tan difícil fue crear e implementar el algoritmo de clasificación de página inicial de los primeros Google?

¿Qué es lo más importante para las empresas de software: código abierto, proyectos extracurriculares o habilidades algorítmicas (habilidades de programación competitiva)?

Cómo saber si / cuándo puede aplicar la manipulación de bits para resolver un problema

Cómo implementar la codificación y decodificación de Huffman usando una matriz y no un árbol

¿Por qué no necesito conocer algoritmos para lenguajes de programación modernos como Java o Python?

Cómo hacer un algoritmo de filtrado basado en contenido de Python

¿Qué depara el futuro para los algoritmos genéticos y qué tan relevantes serán en 20 años?

¿Dónde puedo encontrar a alguien dispuesto a enseñarme estructura de datos y algoritmos de forma gratuita o a un costo muy barato?

¿Qué algoritmo es fácil de aprender pero aún tiene una gran importancia?

¿Cuál es la intuición detrás del algoritmo de clasificación rápida de múltiples claves?

Cómo detectar imágenes en un documento de Word escaneado

¿Por qué se han desarrollado los algoritmos de ordenamiento O (n ^ 2) (como el ordenamiento por inserción y el ordenamiento por burbuja) y para qué se utilizan?

Lo que algunos deben saber son punteros para la optimización del código fundamental en Java