Automata and Formal Languages