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:
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
Otro ejemplo: si consideras las reglas
|
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
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.
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.
Resolver 20 entradas cualesquiera, con 1000 preguntas cada una.
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