Gramaticando P71785


Statement
 

pdf   zip

thehtml

En este problema usaremos la siguiente terminología. Las letras mayúsculas son conjuntos. Cualquier otro símbolo (letra minúscula, símbolo de puntuación, etc.) es un carácter. Una regla es una expresión que sirve para definir las palabras que pertenecen a un conjunto. Por ejemplo, la regla

S ← aS  ⋃  bT  ⋃  . 

indica que las palabras de S son:

  • El carácter punto (.).
  • Cualquier palabra de S, precedida por una letra ’a’, como por ejemplo, a., aa., aaa., aaaa., etc.
  • Cualquier palabra de T, precedida por una letra ’b’.

Estos tres modos de obtener palabras para el conjunto se denominan producciones. Está claro que, a menos que sepamos cuáles son las palabras de T, no podremos conocer todas las palabras de S. Si al ejemplo anterior le añadiéramos la regla

T ← aS  ⋃  . 

podrías comprobar que el conjunto S estaría formado por las palabras

. a. b. aa. ab. ba. aaa. aab. aba. baa. bab.

Otro ejemplo: si consideras las reglas

     
P ← ()P ⋃ (K)P  ⋃ .          
K ← () ⋃ (K) ⋃ (K)K          

descubrirás que P es (exactamente) el conjunto de las expresiones bien parentizadas, acabadas en punto (.).

En este problema te pedimos que, a partir de una descripción de conjuntos a base de reglas, calcules cuántas palabras de un cierto tamaño pertenecen a un conjunto. Además, si la misma palabra puede crearse de varios modos distintos (como en el ejemplo 2), debes contarla tantas veces como modos distintos haya de crearla.

Entrada

La entrada empieza con varias reglas (entre 1 y 10). Cada regla se describe en una línea: empieza con una letra mayúscula (el conjunto) seguido de un espacio, los símbolos <---, y otro espacio. A continuación, y en la misma línea, se da una cantidad indeterminada, posiblemente vacía, de producciones. Las producciones se separan por espacios, y pueden contener cualquier combinación de conjuntos (letras mayúsculas) y otros símbolos, exceptuando el símbolo guión (-). Después de la última regla se da una línea formada por cinco guiones.

Se da una única regla para cada conjunto que aparece en una producción. No aparecerán producciones formadas por una única letra mayúscula, ni producciones con más de 10 caracteres, ni reglas con más de 10 producciones. Una regla sin producciones indica que el conjunto correspondiente es el vacío (no tiene ninguna palabra, de ningún tamaño).

A continuación, se plantea una cantidad indeterminada de preguntas. Cada pregunta es una línea de la forma “X n”, donde X es uno de los conjuntos para los cuales hay regla, y 1≤ n≤ 100 es el tamaño por el que se pregunta.

Dispones de un segundo de CPU para resolver cada entrada.

Salida

Para cada pregunta “X n”, hay que responder en una línea cuántas palabras de n letras tiene el conjunto X. Todas las respuestas serán menores a 109.

Puntuación

  • TestA:  ‍40 Puntos ‍

    Resolver 20 entradas, con como mucho 10 preguntas cada una, donde todas las producciones serán del tipo aB o c, como en el ejemplo 1.

  • TestB:  ‍30 Puntos ‍

    Resolver 20 entradas, con como mucho 1000 preguntas cada una, donde ninguna producción tendrá más de 2 letras de conjunto, como en el ejemplo 2.

  • TestC:  ‍30 Puntos ‍

    Resolver 20 entradas cualesquiera, con 1000 preguntas cada una.

Public test cases
  • Input

    S <--- aS bT .
    T <--- aS .
    -----
    S 1
    S 2
    S 3
    S 4
    S 5
    T 1
    T 2
    T 3
    T 4
    T 5
    

    Output

    1
    2
    3
    5
    8
    1
    1
    2
    3
    5
    
  • Input

    S <--- aS bT aS .
    T <--- aS .
    H <--- aH aH .
    Q <---
    -----
    S 1
    S 2
    S 3
    S 4
    S 5
    H 1
    H 2
    H 3
    Q 1
    Q 2
    Q 3
    

    Output

    1
    3
    7
    17
    41
    1
    2
    4
    0
    0
    0
    
  • Input

    P <--- ()P (K)P .
    K <--- () (K) (K)K
    -----
    P 1
    P 2
    P 3
    P 4
    P 5
    P 6
    P 7
    P 8
    P 9
    P 10
    

    Output

    1
    0
    1
    0
    2
    0
    4
    0
    9
    0
    
  • Input

    A <--- yABABABy x y zz
    B <--- a bb a ABABAB
    -----
    A 1
    B 1
    A 15
    A 20
    A 23
    B 15
    B 20
    

    Output

    2
    2
    90624
    25466976
    352849850
    211200
    143343732
    
  • Information
    Author
    Omer Giménez
    Language
    Spanish
    Official solutions
    C++
    User solutions
    C++