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 Java8 (OpenJDK 1.8.0) (judge verdict: Memory Limit Exceeded)

import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.next();
        String []PARTS = {"dream","dreamer","erase","eraser"};
        boolean flag = true;
        boolean able = true;
        while(flag) {
            flag = false;
            if (input.equals("")) able =true;
            for (int i = 0; i < PARTS.length; i++) {
                if (input.endsWith(PARTS[i])) {
                    input = input.substring(0, input.length() - PARTS[i].length());
                    flag= true;
                }
            }
            if (input.equals("")) able =true;
            else able = false;
        }
        if(able){
            System.out.println("YES");
        }
        else{
            System.out.println("NO");
        }

        sc.close();

    }

//    private static boolean check(String s){
//        boolean flag = true;
//        while(flag) {
//            flag = false;
//            if (s.equals("")) return true;
//            for (int i = 0; i < PARTS.length; i++) {
//                if (s.endsWith(PARTS[i])) {
//                   s = s.substring(0, s.length() - PARTS[i].length());
//                    flag= true;
//                }
//            }
//        }
//        return false;
//    }

}