Рівняння над словами#4132

Рівняння над словами

1 секунда
128 мегабайтів
Дуже легка

Вам дано слово і шаблон . Ви хочете перевірити, чи можна видалити деякі букви з , щоб з решти символів утворити . Наприклад, слово programming можна частково видалити, щоб отримати pong, program або roaming (але не map, оскільки букви повинні залишатися в тому ж порядку). Обидва слова складаються лише з малих літер англійського алфавіту.

Є лише одна складність: текст кодується системою рівнянь. У рівняннях використовуються спеціальні символи (кожен символ позначається словом з великих літер), кожен з яких кодує певне слово в алфавіті {a, ..., z}. Кожне рівняння має одну з наступних форм:

A = слово над алфавітом {a,...,z}

або

A = B + C

де A, B, C можуть бути будь-якими символами, а символ + означає конкатенацію слів. Система є:

Така система завжди має єдине розв'язання. Наприклад, у системі:

символ START кодує слово goodtimesbadtimes.

Маючи одне слово як шаблон, систему рівнянь і один конкретний початковий символ цієї системи, визначте, чи присутній шаблон у слові, закодованому .

Вхідні дані

Перший рядок містить кількість тестів . Опис тестів наведено нижче:

Кожен тест починається з рядка, що містить одне ціле число (1 \le k \le 500) - кількість рівнянь. Наступні рядків містять рівняння. Кожне з них має одну з двох форм, зазначених в умові задачі, з пробілами, що розділяють слова, знаками плюс і знаками рівнянь. Кожне слово (включаючи імена символів) має довжину не менше одного і не більше п'яти символів.

Наступний рядок містить один спеціальний символ (слово великими літерами), а заключний рядок містить непорожнє слово, що містить не більше малих літер. Це початковий символ і шаблон для пошуку відповідно.

Вихідні дані

Для кожного тесту виведіть відповідь в окремому рядку: YES, якщо шаблон присутній у заданому слові, і NO в іншому випадку.

Приклади

Приклад 1

Loading
Loading