Ranking y unranking

Se quiere transmitir un subconjunto de kk elementos de {1,,n}\{1, \ldots, n\} tal que ningún par de elementos está a distancia menor de tt. Por ejemplo, para k=4k=4, n=100n=100 y t=8t=8, los siguientes son subconjuntos válidos, {25,50,75,100}{1,10,18,45}{50,58,66,74}\begin{align*} & \{ 25, 50, 75, 100 \} \\ & \{ 1, 10, 18, 45 \} \\ & \{ 50, 58, 66, 74 \} \end{align*} pero el subconjunto {5,45,52,100}\{5, 45, 52, 100\} no es válido puesto que 5245=752 - 45 = 7, que es menor que t=8t=8.

Hay varios modos posibles de codificar conjuntos semejantes: por ejemplo, podríamos usar nn bits para decir, para cada elemento, si está o no en el conjunto; o podríamos usar kk números de log2n\log_2{n} bits para dar la lista de los elementos que están dentro (o nkn-k números para dar la lista de los que están fuera). Pero la codificación más eficiente de todas, para cualquier combinación de n,kn, k y tt, es el proceso conocido como ranking. Para codificiar un conjunto, se hace lo siguiente:

Por ejemplo, para n=11,k=3,t=4n=11, k=3, t=4, la lista ordenada de subconjuntos válidos es: {1,5,9},{1,5,10},{1,5,11},{1,6,10},{1,6,11},{1,7,11},{2,6,10},{2,6,11},{2,7,11},{3,7,11}.\begin{align*} & \{1, 5, 9\}, \{1, 5, 10\}, \{1, 5, 11\}, \{1, 6, 10\}, \{1, 6, 11\}, \\ & \{1, 7, 11\}, \{2, 6, 10\}, \{2, 6, 11\}, \{2, 7, 11\}, \{3, 7, 11\}. \end{align*} En este caso, el subconjunto {2,6,10}\{2, 6, 10\} se codificaría (ranking) como 77, mientras que la decodificación (unranking) del número 4 sería el subconjunto {1,6,10}\{1, 6, 10\}.

Se te pide que hagas un programa que sepa codificar y descodificar conjuntos siguiendo el proceso anterior.

Entrada

Una línea con 3 números n,kn, k y tt, separados por espacios. Se cumple que n100n\le 100 y que el número de subconjuntos válidos no es mayor que 101810^{18}. A continuación, un número arbitrario de líneas de la forma C x1x2xkx_1 x_2 \cdots x_k, donde {x1,,xk}\{x_1, \ldots, x_k\} es un subconjunto válido con x1<<xkx_1<\cdots<x_k, o de la forma D ss, donde ss es un número entre 11 y el número de subconjuntos válidos.

Salida

Escribe una línea con la codificación de {x1,,xk}\{x_1, \ldots, x_k\} (si la entrada empieza por C) o la descodificación de ss (con los elementos del subconjunto ordenados y separados por espacios) si la entrada empieza por D.

Pista

No es necesario (ni deseable, a menos que nn sea pequeña) generar todos los subconjuntos válidos para hacer el ranking y el unranking.

Puntuación

Información del problema

Autoría: Omer Giménez

Generación: 2026-01-25T11:57:19.090Z

© Jutge.org, 2006–2026.
https://jutge.org