import java.util.Scanner;

//提出時にclass Main に書き換え
public class Main {
	public static void main(String[] args)  {
		// 標準入力を受け取る
		Scanner sc = new Scanner(System.in);
		String S = sc.nextLine(); // String Sを受け取る
		sc.close(); // 標準入力を終了

		// 操作で追加できる文字列
		String[] t = {"dream", "dreamer", "erase", "eraser"};
		String[] rt = new String[4];

		// Sを反転
		String rs = new StringBuffer(S).reverse().toString();

		// tを反転
		for(int i = 0; i < t.length; i++) {
			rt[i] = new StringBuffer(t[i]).reverse().toString();
		}


		boolean can = true; // 可能フラグ
	    boolean dis = false; // 発見フラグ

		while(rs.length() > 0 && can) {
			for(int i = 0; i < rt.length; i++) {
				// rsがrt中の文字列で始まるか調査
				if(rs.startsWith(rt[i])) {
					// 見つかった分の文字列を切り取る
					rs = rs.substring(rt[i].length());
					dis = true;
					break; // for処理中断
				}
			}
			// 発見フラグがtrueで無ければ、可能フラグをfalseに
			if(!dis) {
				can = false;
			} else {
				dis = false;
			}
		}

		// 可能フラグがtrueならYESを出力
		if(can) {
			System.out.println("YES");
		} else {
			System.out.println("NO");
		}

	}

} import java.util.Scanner; Scanner java.util public class Main {
	public static void main(String[] args)  {
		// 標準入力を受け取る
		Scanner sc = new Scanner(System.in);
		String S = sc.nextLine(); // String Sを受け取る
		sc.close(); // 標準入力を終了

		// 操作で追加できる文字列
		String[] t = {"dream", "dreamer", "erase", "eraser"};
		String[] rt = new String[4];

		// Sを反転
		String rs = new StringBuffer(S).reverse().toString();

		// tを反転
		for(int i = 0; i < t.length; i++) {
			rt[i] = new StringBuffer(t[i]).reverse().toString();
		}


		boolean can = true; // 可能フラグ
	    boolean dis = false; // 発見フラグ

		while(rs.length() > 0 && can) {
			for(int i = 0; i < rt.length; i++) {
				// rsがrt中の文字列で始まるか調査
				if(rs.startsWith(rt[i])) {
					// 見つかった分の文字列を切り取る
					rs = rs.substring(rt[i].length());
					dis = true;
					break; // for処理中断
				}
			}
			// 発見フラグがtrueで無ければ、可能フラグをfalseに
			if(!dis) {
				can = false;
			} else {
				dis = false;
			}
		}

		// 可能フラグがtrueならYESを出力
		if(can) {
			System.out.println("YES");
		} else {
			System.out.println("NO");
		}

	}

} Main public static void main(String[] args)  {
		// 標準入力を受け取る
		Scanner sc = new Scanner(System.in);
		String S = sc.nextLine(); // String Sを受け取る
		sc.close(); // 標準入力を終了

		// 操作で追加できる文字列
		String[] t = {"dream", "dreamer", "erase", "eraser"};
		String[] rt = new String[4];

		// Sを反転
		String rs = new StringBuffer(S).reverse().toString();

		// tを反転
		for(int i = 0; i < t.length; i++) {
			rt[i] = new StringBuffer(t[i]).reverse().toString();
		}


		boolean can = true; // 可能フラグ
	    boolean dis = false; // 発見フラグ

		while(rs.length() > 0 && can) {
			for(int i = 0; i < rt.length; i++) {
				// rsがrt中の文字列で始まるか調査
				if(rs.startsWith(rt[i])) {
					// 見つかった分の文字列を切り取る
					rs = rs.substring(rt[i].length());
					dis = true;
					break; // for処理中断
				}
			}
			// 発見フラグがtrueで無ければ、可能フラグをfalseに
			if(!dis) {
				can = false;
			} else {
				dis = false;
			}
		}

		// 可能フラグがtrueならYESを出力
		if(can) {
			System.out.println("YES");
		} else {
			System.out.println("NO");
		}

	} main {
		// 標準入力を受け取る
		Scanner sc = new Scanner(System.in);
		String S = sc.nextLine(); // String Sを受け取る
		sc.close(); // 標準入力を終了

		// 操作で追加できる文字列
		String[] t = {"dream", "dreamer", "erase", "eraser"};
		String[] rt = new String[4];

		// Sを反転
		String rs = new StringBuffer(S).reverse().toString();

		// tを反転
		for(int i = 0; i < t.length; i++) {
			rt[i] = new StringBuffer(t[i]).reverse().toString();
		}


		boolean can = true; // 可能フラグ
	    boolean dis = false; // 発見フラグ

		while(rs.length() > 0 && can) {
			for(int i = 0; i < rt.length; i++) {
				// rsがrt中の文字列で始まるか調査
				if(rs.startsWith(rt[i])) {
					// 見つかった分の文字列を切り取る
					rs = rs.substring(rt[i].length());
					dis = true;
					break; // for処理中断
				}
			}
			// 発見フラグがtrueで無ければ、可能フラグをfalseに
			if(!dis) {
				can = false;
			} else {
				dis = false;
			}
		}

		// 可能フラグがtrueならYESを出力
		if(can) {
			System.out.println("YES");
		} else {
			System.out.println("NO");
		}

	} Scanner sc = new Scanner(System.in); sc new Scanner(System.in) String S = sc.nextLine(); S sc.nextLine() sc.nextLine sc sc.close() sc.close sc String[] t = {"dream", "dreamer", "erase", "eraser"}; t {"dream", "dreamer", "erase", "eraser"} "dream" "dreamer" "erase" "eraser" String[] rt = new String[4]; rt new String[4] 4 String rs = new StringBuffer(S).reverse().toString(); rs new StringBuffer(S).reverse().toString() new StringBuffer(S).reverse().toString new StringBuffer(S).reverse() new StringBuffer(S).reverse new StringBuffer(S) for(int i = 0; i < t.length; i++) {
			rt[i] = new StringBuffer(t[i]).reverse().toString();
		} int i = 0; int i = 0; i 0 i < t.length i t.length t t.length i++ i++ i {
			rt[i] = new StringBuffer(t[i]).reverse().toString();
		} {
			rt[i] = new StringBuffer(t[i]).reverse().toString();
		} rt[i] = new StringBuffer(t[i]).reverse().toString() rt[i] rt i new StringBuffer(t[i]).reverse().toString() new StringBuffer(t[i]).reverse().toString new StringBuffer(t[i]).reverse() new StringBuffer(t[i]).reverse new StringBuffer(t[i]) boolean can = true; can true boolean dis = false; dis false while(rs.length() > 0 && can) {
			for(int i = 0; i < rt.length; i++) {
				// rsがrt中の文字列で始まるか調査
				if(rs.startsWith(rt[i])) {
					// 見つかった分の文字列を切り取る
					rs = rs.substring(rt[i].length());
					dis = true;
					break; // for処理中断
				}
			}
			// 発見フラグがtrueで無ければ、可能フラグをfalseに
			if(!dis) {
				can = false;
			} else {
				dis = false;
			}
		} rs.length() > 0 && can rs.length() > 0 rs.length() rs.length rs 0 can {
			for(int i = 0; i < rt.length; i++) {
				// rsがrt中の文字列で始まるか調査
				if(rs.startsWith(rt[i])) {
					// 見つかった分の文字列を切り取る
					rs = rs.substring(rt[i].length());
					dis = true;
					break; // for処理中断
				}
			}
			// 発見フラグがtrueで無ければ、可能フラグをfalseに
			if(!dis) {
				can = false;
			} else {
				dis = false;
			}
		} for(int i = 0; i < rt.length; i++) {
				// rsがrt中の文字列で始まるか調査
				if(rs.startsWith(rt[i])) {
					// 見つかった分の文字列を切り取る
					rs = rs.substring(rt[i].length());
					dis = true;
					break; // for処理中断
				}
			} int i = 0; int i = 0; i 0 i < rt.length i rt.length rt rt.length i++ i++ i {
				// rsがrt中の文字列で始まるか調査
				if(rs.startsWith(rt[i])) {
					// 見つかった分の文字列を切り取る
					rs = rs.substring(rt[i].length());
					dis = true;
					break; // for処理中断
				}
			} {
				// rsがrt中の文字列で始まるか調査
				if(rs.startsWith(rt[i])) {
					// 見つかった分の文字列を切り取る
					rs = rs.substring(rt[i].length());
					dis = true;
					break; // for処理中断
				}
			} if(rs.startsWith(rt[i])) {
					// 見つかった分の文字列を切り取る
					rs = rs.substring(rt[i].length());
					dis = true;
					break; // for処理中断
				} rs.startsWith(rt[i]) rs.startsWith rs rt[i] rt i {
					// 見つかった分の文字列を切り取る
					rs = rs.substring(rt[i].length());
					dis = true;
					break; // for処理中断
				} rs = rs.substring(rt[i].length()) rs rs.substring(rt[i].length()) rs.substring rs rt[i].length() rt[i].length rt[i] rt i dis = true dis true break; // for処理中断 if(!dis) {
				can = false;
			} else {
				dis = false;
			} !dis dis {
				can = false;
			} can = false can false {
				dis = false;
			} dis = false dis false if(can) {
			System.out.println("YES");
		} else {
			System.out.println("NO");
		} can {
			System.out.println("YES");
		} System.out.println("YES") System.out.println System.out System System.out "YES" {
			System.out.println("NO");
		} System.out.println("NO") System.out.println System.out System System.out "NO" String[] args args public class Main {
	public static void main(String[] args)  {
		// 標準入力を受け取る
		Scanner sc = new Scanner(System.in);
		String S = sc.nextLine(); // String Sを受け取る
		sc.close(); // 標準入力を終了

		// 操作で追加できる文字列
		String[] t = {"dream", "dreamer", "erase", "eraser"};
		String[] rt = new String[4];

		// Sを反転
		String rs = new StringBuffer(S).reverse().toString();

		// tを反転
		for(int i = 0; i < t.length; i++) {
			rt[i] = new StringBuffer(t[i]).reverse().toString();
		}


		boolean can = true; // 可能フラグ
	    boolean dis = false; // 発見フラグ

		while(rs.length() > 0 && can) {
			for(int i = 0; i < rt.length; i++) {
				// rsがrt中の文字列で始まるか調査
				if(rs.startsWith(rt[i])) {
					// 見つかった分の文字列を切り取る
					rs = rs.substring(rt[i].length());
					dis = true;
					break; // for処理中断
				}
			}
			// 発見フラグがtrueで無ければ、可能フラグをfalseに
			if(!dis) {
				can = false;
			} else {
				dis = false;
			}
		}

		// 可能フラグがtrueならYESを出力
		if(can) {
			System.out.println("YES");
		} else {
			System.out.println("NO");
		}

	}

} public class Main {
	public static void main(String[] args)  {
		// 標準入力を受け取る
		Scanner sc = new Scanner(System.in);
		String S = sc.nextLine(); // String Sを受け取る
		sc.close(); // 標準入力を終了

		// 操作で追加できる文字列
		String[] t = {"dream", "dreamer", "erase", "eraser"};
		String[] rt = new String[4];

		// Sを反転
		String rs = new StringBuffer(S).reverse().toString();

		// tを反転
		for(int i = 0; i < t.length; i++) {
			rt[i] = new StringBuffer(t[i]).reverse().toString();
		}


		boolean can = true; // 可能フラグ
	    boolean dis = false; // 発見フラグ

		while(rs.length() > 0 && can) {
			for(int i = 0; i < rt.length; i++) {
				// rsがrt中の文字列で始まるか調査
				if(rs.startsWith(rt[i])) {
					// 見つかった分の文字列を切り取る
					rs = rs.substring(rt[i].length());
					dis = true;
					break; // for処理中断
				}
			}
			// 発見フラグがtrueで無ければ、可能フラグをfalseに
			if(!dis) {
				can = false;
			} else {
				dis = false;
			}
		}

		// 可能フラグがtrueならYESを出力
		if(can) {
			System.out.println("YES");
		} else {
			System.out.println("NO");
		}

	}

} Main
import java.util.Scanner;

//提出時にclass Main に書き換え
public class Main {
	public static void main(String[] args)  {
		// 標準入力を受け取る
		Scanner sc = new Scanner(System.in);
		String S = sc.nextLine(); // String Sを受け取る
		sc.close(); // 標準入力を終了

		// 操作で追加できる文字列
		String[] t = {"dream", "dreamer", "erase", "eraser"};
		String[] rt = new String[4];

		// Sを反転
		String rs = new StringBuffer(S).reverse().toString();

		// tを反転
		for(int i = 0; i < t.length; i++) {
			rt[i] = new StringBuffer(t[i]).reverse().toString();
		}


		boolean can = true; // 可能フラグ
	    boolean dis = false; // 発見フラグ

		while(rs.length() > 0 && can) {
			for(int i = 0; i < rt.length; i++) {
				// rsがrt中の文字列で始まるか調査
				if(rs.startsWith(rt[i])) {
					// 見つかった分の文字列を切り取る
					rs = rs.substring(rt[i].length());
					dis = true;
					break; // for処理中断
				}
			}
			// 発見フラグがtrueで無ければ、可能フラグをfalseに
			if(!dis) {
				can = false;
			} else {
				dis = false;
			}
		}

		// 可能フラグがtrueならYESを出力
		if(can) {
			System.out.println("YES");
		} else {
			System.out.println("NO");
		}

	}

}