Cod sursa(job #2583166)

Utilizator fminostress9FMI No Stress 9 fminostress9 Data 17 martie 2020 20:40:59
Problema NFA Scor Ascuns
Compilator py Status done
Runda Marime 1.96 kb
class Automat:
    def __init__(self, nr_stari, stare_init):
        self.nr_stari = nr_stari
        self.stare_init = stare_init
        self.vecini = [dict([]) for i in range(0, nr_stari)]
        self.is_final = [False for i in range(0, nr_stari)]
        self.viz = [[] for i in range(0, nr_stari)]

    def add_stare_finala(self, stare):
        self.is_final[stare] = True

    def add_edge(self, x: int, y: int, val: str):
        if self.vecini[x].get(val) is None:
            self.vecini[x][val] = []
        self.vecini[x][val].append(y)

    def contains_util(self, nod, cuv) -> bool:
        if len(cuv) == 0:
            return self.is_final[nod]
        if self.viz[nod][len(cuv)-1]:
            return False
        self.viz[nod][len(cuv) - 1] = True
        for vecin in self.vecini[nod].get(cuv[0], []):
            if self.contains_util(vecin, cuv[1:]):
                return True
        return False

    def contains(self, cuv: str) -> bool:
        for i in range(0, len(self.viz)):
            self.viz[i] = [False for j in range(0, len(cuv))]

        ret = self.contains_util(self.stare_init, cuv)

        for i in range(0, len(self.viz)):
            self.viz[i] = []
        return ret


class reader:
    def __init__(self, filename):
        f = open(filename, "r")
        self.vars = f.read().split()
        self.pos = 0
        f.close()

    def GetNext(self) -> str:
        self.pos += 1
        return self.vars[self.pos-1]


cin = reader("nfa.in")
out = open("nfa.out", "w")
n = int(cin.GetNext())
m = int(cin.GetNext())
k = int(cin.GetNext())
s = int(cin.GetNext())
aut = Automat(n+1, s)
for i in range(0, k):
    aut.add_stare_finala(int(cin.GetNext()))
for i in range(0, m):
    a = int(cin.GetNext())
    b = int(cin.GetNext())
    c = cin.GetNext()
    aut.add_edge(a, b, c)
q = int(cin.GetNext())
for i in range(0, q):
    cuv = cin.GetNext()
    out.write(str(int(aut.contains(cuv))) + "\n")