Problem p01755 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <cassert>
#include <cctype>
#include <cstdint>
#include <cstdio>
#include <map>
#include <stack>
#include <string>
#include <utility>
#include <vector>

#define fprintf(...) void(0)

std::map<size_t, size_t> preprocess(const std::string &s, std::string &t) {
  std::stack<size_t> opened;
  std::map<size_t, size_t> paren;
  for (size_t i = 0; i < s.length(); ++i) {
    char ch = s[i];
    if (ch == '~') {
      ch = s[++i];
      t += ch ^ 0x20;
    } else if (isalpha(ch)) {
      t += ch;
    } else if (ch == '{' || ch == '[') {
      opened.emplace(t.length());
      t += ch;
    } else if (ch == '}' || ch == ']') {
      size_t opening = opened.top();
      opened.pop();
      paren[opening] = t.length();
      paren[t.length()] = opening;
      t += ch;
    } else {
      t += ch;
    }
  }
  fprintf(stderr, "t: %s\\n", t.c_str());
  return paren;
}

const size_t di[] = {size_t(-1), 0, 1, 0};
const size_t dj[] = {0, 1, 0, size_t(-1)};
const char dc[] = {'N', 'E', 'S', 'W'};

intmax_t exec(const std::vector<std::string> &a, const std::string &s,
              const std::map<size_t, size_t> &paren, intmax_t max_cmd) {

  size_t ci = 0, cj = 0;
  for (size_t i = 0; i < a.size(); ++i) {
    for (size_t j = 0; j < a[i].length(); ++j) {
      if (a[i][j] == 's') {
        ci = i;
        cj = j;
        break;
      }
    }
  }

  intmax_t step = 0, cmd = 0;
  size_t i = 0, d = 0;
  while (i < s.length() && ++cmd < max_cmd) {
    fprintf(stderr, "(%zu, %zu)\\n", ci, cj);
    fprintf(stderr, "s[%zu]: %c\\n", i, s[i]);
    fflush(stderr);
    if (s[i] == '^') {
      if (a[ci + di[d]][cj + dj[d]] != '#') {
        ci += di[d];
        cj += dj[d];
      }
      ++step;
    } else if (s[i] == 'v') {
      if (a[ci - di[d]][cj - dj[d]] != '#') {
        ci -= di[d];
        cj -= dj[d];
      }
      ++step;
    } else if (s[i] == '<') {
      (d == 0 ? d = 3 : --d);
      ++step;
    } else if (s[i] == '>') {
      (d == 3 ? d = 0 : ++d);
      ++step;
    } else if (s[i] == '[' || s[i] == '{') {
      size_t closing = paren.at(i);
      ++i;
      char cond = s[i];
      if (isupper(cond) && (cond == dc[d] || cond == 'T')) {
        // pass
      } else if (cond == 'C' && a[ci + di[d]][cj + dj[d]] == '#') {
        // pass
      } else if (islower(cond) && !(cond == (dc[d] | 0x20) || cond == 't') &&
                 cond != 'c') {
        // pass
      } else if (cond == 'c' && a[ci + di[d]][cj + dj[d]] != '#') {
        // pass
      } else {
        i = closing;
      }
    } else if (s[i] == ']') {
      // end-if
    } else if (s[i] == '}') {
      // end-while
      i = paren.at(i) - 1;
    }
    ++i;
    if (a[ci][cj] == 'g')
      break;
  }
  if (a[ci][cj] != 'g')
    return max_cmd;
  return step;
}

int main() {
  size_t H, W;
  scanf("%zu %zu", &H, &W);
  std::vector<std::string> a(H);
  for (size_t i = 0; i < H; ++i) {
    char buf[64];
    scanf("%s", buf);
    a[i] = std::move(buf);
  }
  char buf[1024];
  scanf("%s", buf);
  std::string s = std::move(buf), t;
  std::map<size_t, size_t> paren = preprocess(s, t);

  intmax_t max_step = 10000000;
  intmax_t step = exec(a, t, paren, max_step);
  printf("%jd\\n", step < max_step ? step : -1);
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <cassert>
#include <cctype>
#include <cstdint>
#include <cstdio>
#include <map>
#include <stack>
#include <string>
#include <utility>
#include <vector>

#define fprintf(...) void(0)

std::map<size_t, size_t> preprocess(const std::string &s, std::string &t) {
  std::stack<size_t> opened;
  std::map<size_t, size_t> paren;
  for (size_t i = 0; i < s.length(); ++i) {
    char ch = s[i];
    if (ch == '~') {
      ch = s[++i];
      t += ch ^ 0x20;
    } else if (isalpha(ch)) {
      t += ch;
    } else if (ch == '{' || ch == '[') {
      opened.emplace(t.length());
      t += ch;
    } else if (ch == '}' || ch == ']') {
      size_t opening = opened.top();
      opened.pop();
      paren[opening] = t.length();
      paren[t.length()] = opening;
      t += ch;
    } else {
      t += ch;
    }
  }
  fprintf(stderr, "t: %s\\n", t.c_str());
  return paren;
}

const size_t di[] = {size_t(-1), 0, 1, 0};
const size_t dj[] = {0, 1, 0, size_t(-1)};
const char dc[] = {'N', 'E', 'S', 'W'};

intmax_t exec(const std::vector<std::string> &a, const std::string &s,
              const std::map<size_t, size_t> &paren, intmax_t max_step) {

  size_t ci = 0, cj = 0;
  for (size_t i = 0; i < a.size(); ++i) {
    for (size_t j = 0; j < a[i].length(); ++j) {
      if (a[i][j] == 's') {
        ci = i;
        cj = j;
        break;
      }
    }
  }

  intmax_t step = 0;
  size_t i = 0, d = 0;
  while (i < s.length() && step < max_step) {
    fprintf(stderr, "(%zu, %zu)\\n", ci, cj);
    fprintf(stderr, "s[%zu]: %c\\n", i, s[i]);
    fflush(stderr);
    if (s[i] == '^') {
      if (a[ci + di[d]][cj + dj[d]] != '#') {
        ci += di[d];
        cj += dj[d];
      }
      ++step;
    } else if (s[i] == 'v') {
      if (a[ci - di[d]][cj - dj[d]] != '#') {
        ci -= di[d];
        cj -= dj[d];
      }
      ++step;
    } else if (s[i] == '<') {
      (d == 0 ? d = 3 : --d);
      ++step;
    } else if (s[i] == '>') {
      (d == 3 ? d = 0 : ++d);
      ++step;
    } else if (s[i] == '[' || s[i] == '{') {
      size_t closing = paren.at(i);
      ++i;
      char cond = s[i];
      if (isupper(cond) && (cond == dc[d] || cond == 'T')) {
        // pass
      } else if (cond == 'C' && a[ci + di[d]][cj + dj[d]] == '#') {
        // pass
      } else if (islower(cond) && !(cond == dc[d] || cond == 't') &&
                 cond != 'c') {
        // pass
      } else if (cond == 'c' && a[ci + di[d]][cj + dj[d]] != '#') {
        // pass
      } else {
        i = closing;
      }
    } else if (s[i] == ']') {
      // end-if
    } else if (s[i] == '}') {
      // end-while
      i = paren.at(i) - 1;
    }
    ++i;
    if (a[ci][cj] == 'g')
      break;
  }
  if (a[ci][cj] != 'g')
    return max_step;
  return step;
}

int main() {
  size_t H, W;
  scanf("%zu %zu", &H, &W);
  std::vector<std::string> a(H);
  for (size_t i = 0; i < H; ++i) {
    char buf[64];
    scanf("%s", buf);
    a[i] = std::move(buf);
  }
  char buf[1024];
  scanf("%s", buf);
  std::string s = std::move(buf), t;
  std::map<size_t, size_t> paren = preprocess(s, t);

  intmax_t max_step = 100000;
  intmax_t step = exec(a, t, paren, max_step);
  printf("%jd\\n", step < max_step ? step : -1);
}