Gramaticando P71785


Statement
 

pdf   zip

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

SaSbT.S \leftarrow aS \ \cup\ bT \ \cup\ .

indica que las palabras de SS son:

  • El carácter punto (.).

  • Cualquier palabra de SS, precedida por una letra ’a’, como por ejemplo, a., aa., aaa., aaaa., etc.

  • Cualquier palabra de TT, 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 TT, no podremos conocer todas las palabras de SS. Si al ejemplo anterior le añadiéramos la regla

TaS.T \leftarrow aS \ \cup\ .

podrías comprobar que el conjunto SS 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\begin{align*} P & \leftarrow ()P\ \cup\ (K)P \ \cup\ . \\ K & \leftarrow ()\ \cup\ (K)\ \cup\ (K)K \end{align*}

descubrirás que PP 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 11 y 1010). 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 “XX nn”, donde XX es uno de los conjuntos para los cuales hay regla, y 1n1001\leq n\leq 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 nn”, hay que responder en una línea cuántas palabras de nn letras tiene el conjunto XX. Todas las respuestas serán menores a 10910^9.

Puntuación

  • TestA:

    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:

    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:

    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++