Problem p03854 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
// #include <iostream>
using namespace std;
int main() {
  long long int N, Y;
  long long int i, j, k;
  char S[10050] = {0};
  scanf("%s", S);
  // cout << S << endl;

  for (i = strlen(S) - 1; i >= 0; i--) {
    int flag = 0;
    // cout << i << " " << endl;
    if (i >= 4) {
      if (S[i] == 'm' && S[i - 1] == 'a' && S[i - 2] == 'e' &&
          S[i - 3] == 'r' && S[i - 4] == 'd') {
        i -= 4;
        // puts("dream");
        flag = 1;
        goto end;
      }
    }
    if (i >= 6) {
      if (S[i] == 'r' && S[i - 1] == 'e' && S[i - 2] == 'm' &&
          S[i - 3] == 'a' && S[i - 4] == 'e' && S[i - 5] == 'r' &&
          S[i - 6] == 'd') {
        i -= 6;
        // puts("dreamer");
        flag = 1;
        goto end;
      }
    }
    if (i >= 5) {
      if (S[i] == 'r' && S[i - 1] == 'e' && S[i - 2] == 's' &&
          S[i - 3] == 'a' && S[i - 4] == 'r' && S[i - 5] == 'e') {
        i -= 5;
        // puts("eraser");
        flag = 1;
        goto end;
      }
    }
    if (i >= 4) {
      if (S[i] == 'e' && S[i - 1] == 's' && S[i - 2] == 'a' &&
          S[i - 3] == 'r' && S[i - 4] == 'e') {
        i -= 4;
        // puts("erase");
        flag = 1;
        goto end;
      }
    }

    else {
      printf("NO\n");
      return 0;
    }
    if (flag == 0) {
      printf("NO\n");
      return 0;
    }
  end:;
  }
  printf("YES\n");
  return 0;
  // scanf("%lld%lld", &N, &Y);

  // for (i = 0; i <= N; i++) {
  //   for (j = 0; j <= N-i; j++) {
  //     k = N - i - j;
  //     //cout << i << " " << j << " " << k << endl;
  //     if ((i*10000) + (j * 5000) + (k*1000) == Y) {
  //       cout << i << " " << j << " " << k << endl;
  //       return 0;
  //     }
  //   }
  // }
  // printf("-1 -1 -1\n");
}


Fixed submission:
#include <bits/stdc++.h>
// #include <iostream>
using namespace std;
int main() {
  long long int N, Y;
  long long int i, j, k;
  char S[100050] = {0};
  scanf("%s", S);
  // cout << S << endl;

  for (i = strlen(S) - 1; i >= 0; i--) {
    int flag = 0;
    // cout << i << " " << endl;
    if (i >= 4) {
      if (S[i] == 'm' && S[i - 1] == 'a' && S[i - 2] == 'e' &&
          S[i - 3] == 'r' && S[i - 4] == 'd') {
        i -= 4;
        // puts("dream");
        flag = 1;
        goto end;
      }
    }
    if (i >= 6) {
      if (S[i] == 'r' && S[i - 1] == 'e' && S[i - 2] == 'm' &&
          S[i - 3] == 'a' && S[i - 4] == 'e' && S[i - 5] == 'r' &&
          S[i - 6] == 'd') {
        i -= 6;
        // puts("dreamer");
        flag = 1;
        goto end;
      }
    }
    if (i >= 5) {
      if (S[i] == 'r' && S[i - 1] == 'e' && S[i - 2] == 's' &&
          S[i - 3] == 'a' && S[i - 4] == 'r' && S[i - 5] == 'e') {
        i -= 5;
        // puts("eraser");
        flag = 1;
        goto end;
      }
    }
    if (i >= 4) {
      if (S[i] == 'e' && S[i - 1] == 's' && S[i - 2] == 'a' &&
          S[i - 3] == 'r' && S[i - 4] == 'e') {
        i -= 4;
        // puts("erase");
        flag = 1;
        goto end;
      }
    }

    else {
      printf("NO\n");
      return 0;
    }
    if (flag == 0) {
      printf("NO\n");
      return 0;
    }
  end:;
  }
  printf("YES\n");
  return 0;
  // scanf("%lld%lld", &N, &Y);

  // for (i = 0; i <= N; i++) {
  //   for (j = 0; j <= N-i; j++) {
  //     k = N - i - j;
  //     //cout << i << " " << j << " " << k << endl;
  //     if ((i*10000) + (j * 5000) + (k*1000) == Y) {
  //       cout << i << " " << j << " " << k << endl;
  //       return 0;
  //     }
  //   }
  // }
  // printf("-1 -1 -1\n");
}