Problem:
Score : 300 points

Problem Statement

You are given a string S consisting of lowercase English letters.
Another string T is initially empty.
Determine whether it is possible to obtain S = T by performing the following operation an arbitrary number of times:

Append one of the following at the end of T: dream, dreamer, erase and eraser.

Constraints

1≦|S|≦10^5

S consists of lowercase English letters.

Input

The input is given from Standard Input in the following format:

S

Output

If it is possible to obtain S = T, print YES. Otherwise, print NO.

Sample Input 1

erasedream

Sample Output 1

YES

Append erase and dream at the end of T in this order, to obtain S = T.

Sample Input 2

dreameraser

Sample Output 2

YES

Append dream and eraser at the end of T in this order, to obtain S = T.

Sample Input 3

dreamerer

Sample Output 3

NO

Solution in Common Lisp (SBCL 1.1.14) (judge verdict: Accepted)

(loop :with n := (read-line)
      :for s :upto (length n)
      :for k :on (concatenate 'list n "0000000")
      :for dp :on (cons 1 (loop :repeat (+ (length n) 6) :collect 0))
      :with j := (loop :for x :in '("dream" "dreamer" "erase" "eraser")
                       :collect (concatenate 'list x))
      :if (char= #\0 (car k))
        :if (= 1 (car dp)) :do (princ "YES")
          :else :do (princ "NO")
      :if (= 1 (car dp))
        :if (equal (subseq k 0 5) (car j)) :do (setf (elt dp 5) 1) :end :and
        :if (equal (subseq k 0 7) (cadr j)) :do (setf (elt dp 7) 1) :end :and
        :if (equal (subseq k 0 5) (caddr j)) :do (setf (elt dp 5) 1) :end :and
        :if (equal (subseq k 0 6) (cadddr j)) :do (setf (elt dp 6) 1))