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

#include <algorithm>
#include <array>
#include <assert.h>
#include <bitset>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <deque>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <vector>

using namespace std;

struct before_main {
  before_main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
  }
} before_main;

#define REP(i, a, b) for (int i = a; i < (int)b; i++)
#define rep(i, n) REP(i, 0, n)
#define all(c) (c).begin(), (c).end()
#define zero(a) memset(a, 0, sizeof a)
#define minus(a) memset(a, -1, sizeof a)
template <class T1, class T2> inline bool minimize(T1 &a, T2 b) {
  return b < a && (a = b, 1);
}
template <class T1, class T2> inline bool maximize(T1 &a, T2 b) {
  return a < b && (a = b, 1);
}
template <class T> ostream &operator<<(ostream &ost, vector<T> const &v) {
  ost << "[";
  rep(i, v.size()) {
    if (i)
      ost << ", ";
    ost << v[i];
  }
  ost << "]";
  return ost;
}

typedef long long ll;
int const inf = 1 << 29;

int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, -1, 0, 1};

int H, W;
ll L;
int dir, y, x, cost;
string const ds = "WNES";

map<tuple<int, int, int>, int> vis;
vector<tuple<int, int, int>> data_;
char G[111][111];

bool in_range(int y, int x, int H, int W) {
  if (!(0 <= y && y < H && 0 <= x && x < W))
    return false;
  if (G[y][x] == '#')
    return false;
  return true;
}

void adjust_dir() {
  while (!in_range(y + dy[dir], x + dx[dir], H, W)) {
    dir++;
    dir %= 4;
  }
}

void debug() {
  cout << "cost = " << cost << endl;
  rep(i, H) {
    rep(j, W) {
      if (isalpha(G[i][j]))
        cout << ".";
      else if (i == y && j == x)
        cout << ds[dir];
      else
        cout << G[i][j];
    }
    cout << endl;
  }
  cout << get<0>(data_.back()) << ", ";
  cout << get<1>(data_.back()) << ", ";
  cout << get<2>(data_.back()) << endl;
  cout << endl;
}

void enter_loop() {
  const int loop_start_cost = vis[make_tuple(y, x, dir)];
  const int len = cost - loop_start_cost;
  /*
  cout << "loop_start_cost = " << loop_start_cost << endl;
  cout << "len = " << len << endl;
  */
  L -= loop_start_cost;
  /*
  cout << "L = " << L << endl;
  cout << "data_.size() = " << data_.size() << endl;
  cout << "soeji = " << loop_start_cost + L % len << endl;
  */
  int Y, X, d;
  tie(Y, X, d) = data_[loop_start_cost + L % len - 1];
  cout << Y + 1 << " " << X + 1 << " " << ds[d] << endl;
}

bool step() {
  adjust_dir();
  y += dy[dir], x += dx[dir];
  cost++;
  if (vis.find(make_tuple(y, x, dir)) != vis.end()) {
    enter_loop();
    return false;
  }
  if (cost == L) {
    cout << y + 1 << " " << x + 1 << " " << ds[dir] << endl;
    return false;
  }
  vis[make_tuple(y, x, dir)] = cost;
  data_.emplace_back(y, x, dir);
  //  debug();
  return true;
}

void simulate() {

  vis.clear();
  data_.clear();
  cost = 0;

  while (step())
    ;
}

int main() {

  for (; cin >> H >> W >> L && (H | W | L);) {
    rep(i, H) rep(j, W) {
      cin >> G[i][j];
      if (isalpha(G[i][j])) {
        y = i, x = j;
        dir = ds.find(G[i][j]);
      }
    }

    simulate();
  }

  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <array>
#include <assert.h>
#include <bitset>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <deque>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <vector>

using namespace std;

struct before_main {
  before_main() {
    cin.tie(0);
    ios::sync_with_stdio(false);
  }
} before_main;

#define REP(i, a, b) for (int i = a; i < (int)b; i++)
#define rep(i, n) REP(i, 0, n)
#define all(c) (c).begin(), (c).end()
#define zero(a) memset(a, 0, sizeof a)
#define minus(a) memset(a, -1, sizeof a)
template <class T1, class T2> inline bool minimize(T1 &a, T2 b) {
  return b < a && (a = b, 1);
}
template <class T1, class T2> inline bool maximize(T1 &a, T2 b) {
  return a < b && (a = b, 1);
}

typedef long long ll;
int const inf = 1 << 29;

int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, -1, 0, 1};

int H, W;
ll L;
int dir, y, x, cost;
string const ds = "WNES";

map<tuple<int, int, int>, int> vis;
vector<tuple<int, int, int>> data_;
char G[111][111];

bool in_range(int y, int x, int H, int W) {
  if (!(0 <= y && y < H && 0 <= x && x < W))
    return false;
  if (G[y][x] == '#')
    return false;
  return true;
}

void adjust_dir() {
  while (!in_range(y + dy[dir], x + dx[dir], H, W)) {
    dir++;
    dir %= 4;
  }
}

bool step() {
  adjust_dir();
  y += dy[dir], x += dx[dir];
  cost++;
  if (vis.find(make_tuple(y, x, dir)) != vis.end()) {
    int len = cost - vis[make_tuple(y, x, dir)];
    L -= cost;
    L %= len;
    int y, x, d;
    tie(y, x, d) = data_[L];
    cout << y + 1 << " " << x + 1 << " " << ds[d] << endl;
    return false;
  }
  if (cost == L) {
    cout << y + 1 << " " << x + 1 << " " << ds[dir] << endl;
    return false;
  }
  return true;
}

void simulate() {

  vis.clear();
  data_.clear();
  cost = 0;

  while (step())
    ;
}

int main() {

  for (; cin >> H >> W >> L && (H | W | L);) {
    rep(i, H) rep(j, W) {
      cin >> G[i][j];
      if (isalpha(G[i][j])) {
        y = i, x = j;
        dir = ds.find(G[i][j]);
      }
    }

    simulate();
  }

  return 0;
}