Codificación aritmética P37123


Statement
 

pdf   zip

Considera un alfabeto Σ\Sigma donde cada letra cic_i tiene asociado una probabilidad pip_i. Por ejemplo, Σ={c1=A,c2=B,c3=C}\Sigma=\{c_1=A, c_2=B, c_3=C\} con p(A)=p1=12,p(B)=p2=15p(C)=p3=310p(A) = p_1 = \frac{1}{2}, \qquad p(B) = p_2 = \frac{1}{5} \qquad p(C) = p_3 = \frac{3}{10} A cada palabra (secuencia de letras) ss del alfabeto Σ\Sigma le asignamos un intervalo I(s)=[a;b)I(s)=[a;b) según las reglas siguientes.

  • El intervalo de la palabra vacía s=λs=\lambda es I(λ)=[0;1).I(\lambda)=[0; 1).

  • El intervalo de la palabra s=tcis=t\cdot c_i, donde tt es una palabra con I(t)=[a;b)I(t)=[a; b) y cic_i es la última letra de ss, es I(s)=[a+(p1++pi1)(ba);a+(p1++pi)(ba)).I(s)=[a + (p_1 + \cdots + p_{i-1})\cdot(b-a); a + (p_1 + \cdots + p_i)\cdot(b-a)).

Por ejemplo, a las palabras λ\lambda, 𝙰\texttt{A}, 𝙰𝙰\texttt{AA}, 𝙰𝙰𝙲\texttt{AAC}, 𝙰𝙰𝙲𝙱\texttt{AACB} les corresponden los siguientes intervalos: I(λ)=[0;1)I(A)=[0+01;0+0.51)=[0;0.5)I(AA)=[0+00.5;0+0.50.5)=[0;0.25)I(AAC)=[0+0.70.25;0+10.25)=[0.175;0.25)I(AACB)=[0.175+0.50.075;0.175+0.70.075)=[0.2125;0.2275)\begin{align*} I(\lambda) &= [0; 1) \\ I(A) &= [0 + 0\cdot 1; 0 + 0.5 \cdot 1) = [0; 0.5) \\ I(AA) &= [0 + 0 \cdot 0.5; 0 + 0.5 \cdot 0.5) = [0; 0.25) \\ I(AAC) &= [0 + 0.7 \cdot 0.25; 0 + 1 \cdot 0.25) =[0.175; 0.25) \\ I(AACB) &= [0.175 + 0.5 \cdot 0.075; 0.175 + 0.7 \cdot 0.075) = [0.2125; 0.2275) \end{align*} Cuantas más letras añadimos, más pequeño es el intervalo resultante.

Entrada

Una línea con el número nn de letras del alfabeto. A continuación, nn líneas con las letras cic_i del alfabeto y las probabilidades pip_i de cada letra. Todas las probabilidades cumplen pi0.1p_i\ge 0.1 y se te garantiza que p1++pn=1p_1 + \cdots + p_n = 1.

Por último, un número indeterminado de líneas con los casos de prueba. Cada caso de pruebas es un número natural k<6k<6 y un número real rr entre 00 y 11.

Salida

Para cada caso, escribe la única palabra ss de kk letras cuyo intervalo I(s)I(s) contiene el real rr. Se te garantiza que las entradas serán tales que nunca tendrás problemas de precisión usando double.

Public test cases
  • Input

    2
    A 0.5
    B 0.5
    1 0.25
    1 0.75
    0 0.5
    2 0.99
    5 0.7501
    5 0.7499
    

    Output

    A
    B
    
    BB
    BBAAA
    BABBB
    
  • Input

    3
    A 0.5
    B 0.2
    C 0.3
    4 0.2124
    4 0.2126
    4 0.2274
    4 0.2276
    4 0.9999
    4 0.9
    

    Output

    AACA
    AACB
    AACB
    AACC
    CCCC
    CBCA
    
  • Information
    Author
    Omer Giménez
    Language
    Spanish
    Official solutions
    C++
    User solutions
    C++