Theory of Computation- Lecture Notes