Problem p01329 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <iostream>
#include <queue>
#include <string>
#include <vector>
#define V(x, y, z) ((x)*1000000 + (y)*1000 + (z))
#define inf 1000000000

using namespace std;

int W, H;
char map[55][55];
int P;
string S[15];
int sx, sy, gx, gy;

vector<string> vec;
int Next[105][4];
bool ng[105][4];
const int dx[] = {1, 0, -1, 0}, dy[] = {0, -1, 0, 1};
const char c[] = {'R', 'U', 'L', 'D'};

int dist[55][55][105];

int bfs() {
  for (int x = 1; x <= W; x++) {
    for (int y = 1; y <= H; y++) {
      for (int k = 0; k < vec.size(); k++) {
        dist[x][y][k] = inf;
      }
    }
  }
  dist[sx][sy][0] = 0;

  queue<int> Q;
  Q.push(V(sx, sy, 0));
  int x, y, state;
  while (Q.size()) {
    state = Q.front() % 1000, Q.front() /= 1000;
    y = Q.front() % 1000, Q.front() /= 1000;
    x = Q.front();
    Q.pop();
    for (int i = 0; i < 4; i++) {
      int nx = x + dx[i], ny = y + dy[i], nstate = Next[state][i];
      if (ng[state][i])
        continue;
      if (nx <= 0 || nx > W || ny <= 0 || ny > H)
        continue;
      if (map[nx][ny] == '#')
        continue;
      if (dist[nx][ny][nstate] < inf)
        continue;
      dist[nx][ny][nstate] = dist[x][y][state] + 1;
      Q.push(V(nx, ny, nstate));
    }
  }

  int ret = inf;
  for (int i = 0; i < vec.size(); i++)
    ret = min(ret, dist[gx][gy][i]);
  if (ret == inf)
    return -1;
  return ret;
}

int main(void) {
  while (1) {
    cin >> H >> W;
    if (H == 0 && W == 0)
      break;

    for (int y = 1; y <= H; y++) {
      for (int x = 1; x <= W; x++) {
        cin >> map[x][y];
        if (map[x][y] == 'S')
          sx = x, sy = y;
        if (map[x][y] == 'G')
          gx = x, gy = y;
      }
    }
    cin >> P;
    for (int i = 0; i < P; i++)
      cin >> S[i];

    vec.clear();
    vec.push_back("");
    for (int i = 0; i < P; i++) {
      for (int j = 0; j < S[i].size(); j++) {
        vec.push_back(S[i].substr(0, j));
      }
    }
    sort(vec.begin(), vec.end());
    vec.erase(unique(vec.begin(), vec.end()), vec.end());

    for (int i = 0; i < vec.size(); i++) {
      for (int j = 0; j < 4; j++) {
        ng[i][j] = false;
      }
    }

    for (int i = 0; i < vec.size(); i++) {
      for (int j = 0; j < 4; j++) {

        string s = vec[i] + c[j];
        for (int k = 0; k < P; k++) {
          string t = s;
          while (t.size()) {
            if (t == S[k]) {
              ng[i][j] = true;
              goto end;
            }
            t = t.substr(1);
          }
        }
      end:;

        while (1) {
          auto p = lower_bound(vec.begin(), vec.end(), s);
          if (*p == s) {
            Next[i][j] = p - vec.begin();
            break;
          }
          s = s.substr(1);
        }
      }
    }

    cout << bfs() << endl;
  }

  return 0;
}


Fixed submission:
#include <algorithm>
#include <iostream>
#include <queue>
#include <string>
#include <vector>
#define V(x, y, z) ((x)*1000000 + (y)*1000 + (z))
#define inf 1000000000

using namespace std;

int W, H;
char map[55][55];
int P;
string S[15];
int sx, sy, gx, gy;

vector<string> vec;
int Next[105][4];
bool ng[105][4];
const int dx[] = {1, 0, -1, 0}, dy[] = {0, -1, 0, 1};
const char c[] = {'R', 'U', 'L', 'D'};

int dist[55][55][105];

int bfs() {
  for (int x = 1; x <= W; x++) {
    for (int y = 1; y <= H; y++) {
      for (int k = 0; k < vec.size(); k++) {
        dist[x][y][k] = inf;
      }
    }
  }
  dist[sx][sy][0] = 0;

  queue<int> Q;
  Q.push(V(sx, sy, 0));
  int x, y, state;
  while (Q.size()) {
    state = Q.front() % 1000, Q.front() /= 1000;
    y = Q.front() % 1000, Q.front() /= 1000;
    x = Q.front();
    Q.pop();
    for (int i = 0; i < 4; i++) {
      int nx = x + dx[i], ny = y + dy[i], nstate = Next[state][i];
      if (ng[state][i])
        continue;
      if (nx <= 0 || nx > W || ny <= 0 || ny > H)
        continue;
      if (map[nx][ny] == '#')
        continue;
      if (dist[nx][ny][nstate] < inf)
        continue;
      dist[nx][ny][nstate] = dist[x][y][state] + 1;
      Q.push(V(nx, ny, nstate));
    }
  }

  int ret = inf;
  for (int i = 0; i < vec.size(); i++)
    ret = min(ret, dist[gx][gy][i]);
  if (ret == inf)
    return -1;
  return ret;
}

int main(void) {
  while (1) {
    cin >> H >> W;
    if (H == 0 && W == 0)
      break;

    for (int y = 1; y <= H; y++) {
      for (int x = 1; x <= W; x++) {
        cin >> map[x][y];
        if (map[x][y] == 'S')
          sx = x, sy = y;
        if (map[x][y] == 'G')
          gx = x, gy = y;
      }
    }
    cin >> P;
    for (int i = 0; i < P; i++)
      cin >> S[i];

    vec.clear();
    vec.push_back("");
    for (int i = 0; i < P; i++) {
      for (int j = 0; j < S[i].size(); j++) {
        vec.push_back(S[i].substr(0, j));
      }
    }
    sort(vec.begin(), vec.end());
    vec.erase(unique(vec.begin(), vec.end()), vec.end());

    for (int i = 0; i < vec.size(); i++) {
      for (int j = 0; j < 4; j++) {
        ng[i][j] = false;
      }
    }

    for (int i = 0; i < vec.size(); i++) {
      for (int j = 0; j < 4; j++) {

        string s = vec[i] + c[j];
        for (int k = 0; k < P; k++) {
          string t = s;
          while (t.size()) {
            if (t == S[k]) {
              ng[i][j] = true;
              goto end;
            }
            t = t.substr(1);
          }
        }
      end:;

        while (1) {
          auto p = lower_bound(vec.begin(), vec.end(), s);
          if (p != vec.end() && *p == s) {
            Next[i][j] = p - vec.begin();
            break;
          }
          s = s.substr(1);
        }
      }
    }

    cout << bfs() << endl;
  }

  return 0;
}