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

#include <bits/stdc++.h>
using namespace std;

int N;
string S[555];
vector<int> G[30];
vector<int> rG[30];
bool used[30];

void dfs(int v, vector<int> &vs) {
  used[v] = true;
  for (int i = 0; i < (int)G[v].size(); i++) {
    if (used[G[v][i]])
      continue;
    dfs(G[v][i], vs);
  }
  vs.push_back(v);
  return;
}
void rdfs(int v, int t) {
  used[v] = true;
  for (int i = 0; i < (int)rG[v].size(); i++) {
    if (used[rG[v][i]])
      continue;
    rdfs(rG[v][i], t);
  }
}

int scc() {
  memset(used, 0, sizeof(used));
  vector<int> vs;
  for (int i = 0; i < 26; i++)
    if (!used[i])
      dfs(i, vs);
  memset(used, 0, sizeof(used));
  int t = 0;
  for (int i = 25; i > -1; i--)
    if (!used[vs[i]])
      rdfs(vs[i], t++);
  return t;
}

void init() {
  for (int i = 0; i < 26; i++) {
    G[i].clear();
    rG[i].clear();
  }
}

void add_edge(char u, char v) {
  if (u == '#' || v == '#')
    return;
  G[u - 'a'].push_back(v - 'a');
  rG[v - 'a'].push_back(u - 'a');
}

void view() {
  for (int i = 0; i < 26; i++) {
    char c = i + 'a';
    cout << c << ": " << endl;
    for (int j = 0; j < (int)G[i].size(); j++) {
      cout << " -> " << (char)(G[i][j] + 'a') << endl;
    }
  }
}

bool makeg(int l, int h, int f) {
  // cout << l<<" " << h << " " << f<< endl;
  if (l >= h)
    return true;
  char c = S[l][f];
  int pd = l;
  if (c == '#')
    return makeg(l + 1, h, f);
  for (int i = l + 1; i <= h; i++) {
    // cout << S[i] << endl;
    if (S[i][f] == '#') {
      if (c != '#')
        return false;
      return makeg(i + 1, h, f);
    }
    //    cout << c << "  "<< S[i][f] << endl;
    if (S[i][f] != c) {
      if (!makeg(pd, i - 1, f + 1))
        return false;
      add_edge(S[i][f], c);
      c = S[i][f];
      pd = i;
    }
  }
  return makeg(pd, h, f + 1);
}

bool make_graph() {
  return makeg(0, N - 1, 0);
  view();
}

int main() {
  while (cin >> N && N) {
    for (int i = 0; i < N; i++) {
      cin >> S[i];
      S[i] += "#";
    }
    init();
    if (!make_graph() || scc() < 26)
      cout << "no" << endl;
    else
      cout << "yes" << endl;
  }
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

int N;
string S[555];
vector<int> G[27];
vector<int> rG[27];
bool used[27];

void dfs(int v, vector<int> &vs) {
  used[v] = true;
  for (int i = 0; i < (int)G[v].size(); i++) {
    if (used[G[v][i]])
      continue;
    dfs(G[v][i], vs);
  }
  vs.push_back(v);
  return;
}
void rdfs(int v, int t) {
  used[v] = true;
  for (int i = 0; i < (int)rG[v].size(); i++) {
    if (used[rG[v][i]])
      continue;
    rdfs(rG[v][i], t);
  }
}

int scc() {
  memset(used, 0, sizeof(used));
  vector<int> vs;
  for (int i = 0; i < 26; i++)
    if (!used[i])
      dfs(i, vs);
  memset(used, 0, sizeof(used));
  int t = 0;
  for (int i = 25; i > -1; i--)
    if (!used[vs[i]])
      rdfs(vs[i], t++);
  return t;
}

void init() {
  for (int i = 0; i < 26; i++) {
    G[i].clear();
    rG[i].clear();
  }
}

void add_edge(char u, char v) {
  G[u - 'a'].push_back(v - 'a');
  rG[v - 'a'].push_back(u - 'a');
}

void view() {
  for (int i = 0; i < 26; i++) {
    char c = i + 'a';
    cout << c << ": " << endl;
    for (int j = 0; j < (int)G[i].size(); j++) {
      cout << " -> " << (char)(G[i][j] + 'a') << endl;
    }
  }
}

bool makeg(int l, int h, int f) {
  // cout << l<<" " << h << " " << f<< endl;
  if (l >= h)
    return true;
  char c = '.';
  int pd;
  c = S[l][f];
  pd = l;
  for (int i = l + 1; i <= h; i++) {
    // cout << S[i] << endl;
    if (S[i][f] == '#') {
      if (c != '#')
        return false;
      if (!makeg(i + 1, h, f))
        return false;
      return true;
    }
    //    cout << c << "  "<< S[i][f] << endl;
    if (S[i][f] != c) {
      if (!makeg(pd, i - 1, f + 1))
        return false;
      add_edge(S[i][f], c);
      c = S[i][f];
      pd = i;
    }
  }
  return makeg(pd, h, f + 1);
}

bool make_graph() {
  return makeg(0, N - 1, 0);
  view();
}

int main() {
  while (cin >> N && N) {
    for (int i = 0; i < N; i++) {
      cin >> S[i];
      S[i] += "#";
    }
    init();
    if (!make_graph() || scc() < 26)
      cout << "no" << endl;
    else
      cout << "yes" << endl;
  }
}