Problem p00750 (C++) — buggy submission, verdict: Runtime Error

#define _USE_MATH_DEFINES
#define _CRT_SECURE_NO_DEPRECATE

#include <algorithm>
#include <bitset>
#include <cassert>
#include <cfloat>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <limits>
#include <list>
#include <map>
#include <memory>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> Pii;
typedef pair<ll, ll> Pll;

#define FOR(i, n) for (int i = 0; i < (n); i++)
#define sz(c) ((int)(c).size())
#define ten(x) ((int)1e##x)
#define tenll(x) ((ll)1e##x)

// #pragma comment(linker,"/STACK:36777216")

template <class T> void chmax(T &l, const T r) { l = max(l, r); }
template <class T> void chmin(T &l, const T r) { l = min(l, r); }
template <class T> T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
template <class T> T extgcd(T a, T b, T &x, T &y) {
  for (T u = y = 1, v = x = 0; a;) {
    T q = b / a;
    swap(x -= q * u, u);
    swap(y -= q * v, v);
    swap(b -= q * a, a);
  }
  return b;
}
template <class T> T mod_inv(T a, T m) {
  T x, y;
  extgcd(a, m, x, y);
  return (m + x % m) % m;
}
ll mod_pow(ll a, ll n, ll mod) {
  ll ret = 1;
  ll p = a % mod;
  while (n) {
    if (n & 1)
      ret = ret * p % mod;
    p = p * p % mod;
    n >>= 1;
  }
  return ret;
}

#ifdef _WIN32
#define mygc(c) (c) = getchar()
#define mypc(c) putchar(c)
#else
#define mygc(c) (c) = getchar_unlocked()
#define mypc(c) putchar_unlocked(c)
#endif

void reader(int &x) {
  int k, m = 0;
  x = 0;
  for (;;) {
    mygc(k);
    if (k == '-') {
      m = 1;
      break;
    }
    if ('0' <= k && k <= '9') {
      x = k - '0';
      break;
    }
  }
  for (;;) {
    mygc(k);
    if (k < '0' || k > '9')
      break;
    x = x * 10 + k - '0';
  }
  if (m)
    x = -x;
}
void reader(ll &x) {
  int k, m = 0;
  x = 0;
  for (;;) {
    mygc(k);
    if (k == '-') {
      m = 1;
      break;
    }
    if ('0' <= k && k <= '9') {
      x = k - '0';
      break;
    }
  }
  for (;;) {
    mygc(k);
    if (k < '0' || k > '9')
      break;
    x = x * 10 + k - '0';
  }
  if (m)
    x = -x;
}
int reader(char c[]) {
  int i, s = 0;
  for (;;) {
    mygc(i);
    if (i != ' ' && i != '\\n' && i != '\\r' && i != '\\t' && i != EOF)
      break;
  }
  c[s++] = i;
  for (;;) {
    mygc(i);
    if (i == ' ' || i == '\\n' || i == '\\r' || i == '\\t' || i == EOF)
      break;
    c[s++] = i;
  }
  c[s] = '\\0';
  return s;
}
template <class T, class S> void reader(T &x, S &y) {
  reader(x);
  reader(y);
}
template <class T, class S, class U> void reader(T &x, S &y, U &z) {
  reader(x);
  reader(y);
  reader(z);
}
template <class T, class S, class U, class V>
void reader(T &x, S &y, U &z, V &w) {
  reader(x);
  reader(y);
  reader(z);
  reader(w);
}

void writer(int x, char c) {
  int s = 0, m = 0;
  char f[10];
  if (x < 0)
    m = 1, x = -x;
  while (x)
    f[s++] = x % 10, x /= 10;
  if (!s)
    f[s++] = 0;
  if (m)
    mypc('-');
  while (s--)
    mypc(f[s] + '0');
  mypc(c);
}
void writer(ll x, char c) {
  int s = 0, m = 0;
  char f[20];
  if (x < 0)
    m = 1, x = -x;
  while (x)
    f[s++] = x % 10, x /= 10;
  if (!s)
    f[s++] = 0;
  if (m)
    mypc('-');
  while (s--)
    mypc(f[s] + '0');
  mypc(c);
}
void writer(const char c[]) {
  int i;
  for (i = 0; c[i] != '\\0'; i++)
    mypc(c[i]);
}
void writer(const char x[], char c) {
  int i;
  for (i = 0; x[i] != '\\0'; i++)
    mypc(x[i]);
  mypc(c);
}
template <class T> void writerLn(T x) { writer(x, '\\n'); }
template <class T, class S> void writerLn(T x, S y) {
  writer(x, ' ');
  writer(y, '\\n');
}
template <class T, class S, class U> void writerLn(T x, S y, U z) {
  writer(x, ' ');
  writer(y, ' ');
  writer(z, '\\n');
}
template <class T> void writerArr(T x[], int n) {
  if (!n) {
    mypc('\\n');
    return;
  }
  FOR(i, n - 1) writer(x[i], ' ');
  writer(x[n - 1], '\\n');
}

struct Q {
  string s;
  int cur;

  bool operator>(const Q &r) const { return s > r.s; }
};

typedef pair<int, string> P;
vector<P> e[40];
int n, a, s, g;

string solve_core() {

  string last[40][600];
  FOR(i, 40) FOR(j, 600) last[i][j] = "{";
  priority_queue<Q, vector<Q>, greater<Q>> pq;

  last[s][0] = "";
  pq.push({"", s});
  while (!pq.empty()) {
    auto p = pq.top();
    pq.pop();
    if (sz(p.s) > 500)
      return "NO";
    if (p.s != last[p.cur][sz(p.s)])
      continue;
    if (p.cur == g) {
      if (sz(p.s) > 400)
        return "NO";
      return p.s;
    }
    for (auto &to : e[p.cur]) {
      Q nxt;
      nxt.s = p.s + to.second;
      nxt.cur = to.first;
      if (sz(nxt.s) > 500)
        continue;
      if (last[nxt.cur][sz(nxt.s)] <= nxt.s)
        continue;
      last[nxt.cur][sz(nxt.s)] = nxt.s;
      pq.push(nxt);
    }
  }

  return "NO";
}

void solve() {
  auto s = solve_core();
  cout << s << endl;
}

int main() {
  while (cin >> n >> a >> s >> g, n) {
    FOR(i, 40) e[i].clear();
    FOR(i, a) {
      int x, y;
      string lab;
      cin >> x >> y >> lab;
      e[x].emplace_back(y, lab);
    }

    solve();
  }
}

Error: WA

Fixed submission:

#define _USE_MATH_DEFINES
#define _CRT_SECURE_NO_DEPRECATE

#include <algorithm>
#include <bitset>
#include <cassert>
#include <cfloat>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <limits>
#include <list>
#include <map>
#include <memory>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> Pii;
typedef pair<ll, ll> Pll;

#define FOR(i, n) for (int i = 0; i < (n); i++)
#define sz(c) ((int)(c).size())
#define ten(x) ((int)1e##x)
#define tenll(x) ((ll)1e##x)

// #pragma comment(linker,"/STACK:36777216")

template <class T> void chmax(T &l, const T r) { l = max(l, r); }
template <class T> void chmin(T &l, const T r) { l = min(l, r); }
template <class T> T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
template <class T> T extgcd(T a, T b, T &x, T &y) {
  for (T u = y = 1, v = x = 0; a;) {
    T q = b / a;
    swap(x -= q * u, u);
    swap(y -= q * v, v);
    swap(b -= q * a, a);
  }
  return b;
}
template <class T> T mod_inv(T a, T m) {
  T x, y;
  extgcd(a, m, x, y);
  return (m + x % m) % m;
}
ll mod_pow(ll a, ll n, ll mod) {
  ll ret = 1;
  ll p = a % mod;
  while (n) {
    if (n & 1)
      ret = ret * p % mod;
    p = p * p % mod;
    n >>= 1;
  }
  return ret;
}

#ifdef _WIN32
#define mygc(c) (c) = getchar()
#define mypc(c) putchar(c)
#else
#define mygc(c) (c) = getchar_unlocked()
#define mypc(c) putchar_unlocked(c)
#endif

void reader(int &x) {
  int k, m = 0;
  x = 0;
  for (;;) {
    mygc(k);
    if (k == '-') {
      m = 1;
      break;
    }
    if ('0' <= k && k <= '9') {
      x = k - '0';
      break;
    }
  }
  for (;;) {
    mygc(k);
    if (k < '0' || k > '9')
      break;
    x = x * 10 + k - '0';
  }
  if (m)
    x = -x;
}
void reader(ll &x) {
  int k, m = 0;
  x = 0;
  for (;;) {
    mygc(k);
    if (k == '-') {
      m = 1;
      break;
    }
    if ('0' <= k && k <= '9') {
      x = k - '0';
      break;
    }
  }
  for (;;) {
    mygc(k);
    if (k < '0' || k > '9')
      break;
    x = x * 10 + k - '0';
  }
  if (m)
    x = -x;
}
int reader(char c[]) {
  int i, s = 0;
  for (;;) {
    mygc(i);
    if (i != ' ' && i != '\\n' && i != '\\r' && i != '\\t' && i != EOF)
      break;
  }
  c[s++] = i;
  for (;;) {
    mygc(i);
    if (i == ' ' || i == '\\n' || i == '\\r' || i == '\\t' || i == EOF)
      break;
    c[s++] = i;
  }
  c[s] = '\\0';
  return s;
}
template <class T, class S> void reader(T &x, S &y) {
  reader(x);
  reader(y);
}
template <class T, class S, class U> void reader(T &x, S &y, U &z) {
  reader(x);
  reader(y);
  reader(z);
}
template <class T, class S, class U, class V>
void reader(T &x, S &y, U &z, V &w) {
  reader(x);
  reader(y);
  reader(z);
  reader(w);
}

void writer(int x, char c) {
  int s = 0, m = 0;
  char f[10];
  if (x < 0)
    m = 1, x = -x;
  while (x)
    f[s++] = x % 10, x /= 10;
  if (!s)
    f[s++] = 0;
  if (m)
    mypc('-');
  while (s--)
    mypc(f[s] + '0');
  mypc(c);
}
void writer(ll x, char c) {
  int s = 0, m = 0;
  char f[20];
  if (x < 0)
    m = 1, x = -x;
  while (x)
    f[s++] = x % 10, x /= 10;
  if (!s)
    f[s++] = 0;
  if (m)
    mypc('-');
  while (s--)
    mypc(f[s] + '0');
  mypc(c);
}
void writer(const char c[]) {
  int i;
  for (i = 0; c[i] != '\\0'; i++)
    mypc(c[i]);
}
void writer(const char x[], char c) {
  int i;
  for (i = 0; x[i] != '\\0'; i++)
    mypc(x[i]);
  mypc(c);
}
template <class T> void writerLn(T x) { writer(x, '\\n'); }
template <class T, class S> void writerLn(T x, S y) {
  writer(x, ' ');
  writer(y, '\\n');
}
template <class T, class S, class U> void writerLn(T x, S y, U z) {
  writer(x, ' ');
  writer(y, ' ');
  writer(z, '\\n');
}
template <class T> void writerArr(T x[], int n) {
  if (!n) {
    mypc('\\n');
    return;
  }
  FOR(i, n - 1) writer(x[i], ' ');
  writer(x[n - 1], '\\n');
}

struct Q {
  string s;
  int cur;

  bool operator>(const Q &r) const { return s > r.s; }
};

typedef pair<int, string> P;
vector<P> e[40];
int n, a, s, g;

string solve_core() {

  string last[40][300];
  FOR(i, 40) FOR(j, 300) last[i][j] = "{";
  priority_queue<Q, vector<Q>, greater<Q>> pq;

  last[s][0] = "";
  pq.push({"", s});
  while (!pq.empty()) {
    auto p = pq.top();
    pq.pop();
    if (sz(p.s) > 300)
      return "NO";
    if (p.s != last[p.cur][sz(p.s)])
      continue;
    if (p.cur == g) {
      if (sz(p.s) > 300)
        return "NO";
      return p.s;
    }
    for (auto &to : e[p.cur]) {
      Q nxt;
      nxt.s = p.s + to.second;
      nxt.cur = to.first;
      if (sz(nxt.s) > 300)
        continue;
      if (last[nxt.cur][sz(nxt.s)] <= nxt.s)
        continue;
      last[nxt.cur][sz(nxt.s)] = nxt.s;
      pq.push(nxt);
    }
  }

  return "NO";
}

void solve() {
  auto s = solve_core();
  cout << s << endl;
}

int main() {
  while (cin >> n >> a >> s >> g, n) {
    FOR(i, 40) e[i].clear();
    FOR(i, a) {
      int x, y;
      string lab;
      cin >> x >> y >> lab;
      e[x].emplace_back(y, lab);
    }

    solve();
  }
}