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 C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
#define For(i,a,b) for(int i=a;i<=b;i++)
 
using namespace std;
 
//const int maxn=;
const int INF=10000;
bool mark[4];
int last=INF;
 
bool ok(char x,int p)
{
	bool ok0=false;
	string a[4]={"maerd","remaerd","esare","resare"};
	int len[4]={5,7,5,6};
	for(int i=0;i<4;i++)
	{
		if(a[i][p%last]==x) ok0=true;
		if(p%last==len[i]-1 && a[i][p%last]==x) last=p+1;
	}
	return ok0;
}
 
int main()
{
	string s;
	cin>>s;
	int p=0;
	int len=s.length();
	for(int i=len-1;i>=0;i--)
	{
		if(!ok(s[i],p++)){
			cout<<"NO";
			return 0;
		}
	}
      
	return 0;
}