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: Time Limit Exceeded)

#-swank
(unless (member :child-sbcl *features*)
  (quit
   :unix-status
   (process-exit-code
    (run-program *runtime-pathname*
                 `("--control-stack-size" "128MB"
                   "--noinform" "--disable-ldb" "--lose-on-corruption" "--end-runtime-options"
                   "--eval" "(push :child-sbcl *features*)"
                   "--script" ,(namestring *load-pathname*))
                 :output t :error t :input t))))
(defmacro dp (name args memo-size &body body)
  (let ((memo (gensym)))
    `(let ((,memo (make-array ,memo-size :initial-element nil)))
       (defun ,name ,args
         (or (aref ,memo ,@args)
             (setf (aref ,memo ,@args)
                   ,@body))))))

(defun split (x str)
  (let ((pos (search x str))
        (size (length x)))
    (if pos
      (cons (subseq str 0 pos)
            (split x (subseq str (+ pos size))))
      (list str))))

(defmacro collect-times (time body)
  `(loop repeat ,time collect ,body))

(defun read-times (time)
  (collect-times time (read)))

(defun main (str)
  (count #\1 str))

(defun prefix-equal (str1 str2)
  (unless str1 (return-from prefix-equal t))
  (unless str2 (return-from prefix-equal nil))
  (and (char= (car str1) (car str2)) (prefix-equal (cdr str1) (cdr str2))))

(defun main (str)
  (let ((names (mapcar (lambda (x)
                         (coerce (reverse x) 'list)) (list "dream" "dreamer" "erase" "eraser")))
        (rts (coerce (reverse str) 'list)))
    (labels ((f (lst)
               (unless lst
                 (return-from f t))
               (loop for name in names
                     when (prefix-equal name lst)
                       do
                          (return-from f (f (subseq lst (length name)))))
               nil))
      (f rts))))

(princ (if (main (read-line)) "YES" "NO"))