#!/usr/bin/env python3 # Author: Ríša Hladík import re def intline(): """Načte řádek ze vstupu, rozdělí ho podle mezer, každou část převede na číslo, a výsledek vrátí jako seznam.""" return [int(a) for a in input().split()] O, V = intline() odbocovaci = [] for _ in range(O): # Přeskočíme údaj o délce řetězce, v Pythonu ho nepotřebujeme: input() odbocovaci.append(input()) vraceci = [] for _ in range(V): input() vraceci.append(input()) input() text = input() def najdi_vyskyty(text, vzory): # V regulárních výrazech mají nějaké znaky speciální význam, například "." # znamená "libovolný znak", a pokud chceme hledat skutečnou tečku, je # potřeba psát "\.". Funkce re.escape vrací řetězec, ve kterém jsou # speciální znaky takto vyescapované. escaped = [re.escape(vzor) for vzor in vzory] # "|" je další speciální znak, který znamená "nebo". Tj. "a|b|cau" je # regulární výraz, který matchuje řetězce "a", "b" a "cau", a níže # vytváříme regulární výraz, který matchuje právě všechny vzory. regularni_vyraz = "|".join(escaped) # Vrátí všechny nepřekrývající se (tj. v našem případě všechny) výskyty # zadaného výrazu. Každý výskyt je objekt typu re.Match, mající m.j. metody # start() a end(), kterými se umíme ptát na začátek a konec výskytu v # textu. return re.finditer(regularni_vyraz, text) zmeny_v_zanoreni = [0] * len(text) for vyskyt in najdi_vyskyty(text, odbocovaci): zmeny_v_zanoreni[vyskyt.start()] = 1 for vyskyt in najdi_vyskyty(text, vraceci): zmeny_v_zanoreni[vyskyt.end()] = -1 zanoreni = 0 vystup = [] # zip(szn_a, szn_b) vrací postupně (szn_a[0], szn_b[0]), (szn_a[1], szn_b[1]), … for c, zmena in zip(text, zmeny_v_zanoreni): zanoreni += zmena if zanoreni == 0: vystup.append(c) # vystup je seznam znaků (protože do řetězce neumíme přidávat znak po znaku), # "".join ho poslepuje dohromady. vystup = "".join(vystup) print(vystup)