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

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template <class T> using vec = vector<T>;
template <class T> using vvec = vector<vec<T>>;

template <int char_size, int margin> class Trie {
private:
  struct Node {
    int ne[char_size];
    int num;
    vec<int> accept;
    Node() : num(0) { memset(ne, -1, sizeof(ne)); }
  };

  vec<Node> nodes;
  int root;

public:
  Trie() : root(0) { nodes.push_back(Node()); }

  void update_direct(int node, int id) {
    nodes[node].accept.push_back(id);
    nodes[node].num++;
  }

  void add(const string &S, int s_id, int node_id, int id) {
    if (s_id == S.size())
      update_direct(node_id, id);
    else {
      int c = S[s_id] - margin;
      if (nodes[node_id].ne[c] == -1) {
        nodes[node_id].ne[c] = (int)nodes.size();
        nodes.push_back(Node());
      }
      add(S, s_id + 1, nodes[node_id].ne[c], id);
    }
  }

  void add(const string &S, int id) { add(S, 0, 0, id); }

  void add(const string &S) { add(S, nodes[0].num); }

  template <class F> void query(const string &S, F &f, int s_id, int node_id) {
    for (auto &id : nodes[node_id].accept)
      f(id);
    if (s_id == S.size())
      return;
    else {
      int c = S[s_id] - margin;
      if (nodes[node_id].ne[c] == -1)
        return;
      query(S, f, s_id + 1, nodes[node_id].ne[c]);
    }
  }

  void dfs(const string &S, int s_id, int node_id, set<char> &st, ll &ans) {
    if (node_id == -1)
      exit(0);
    if (s_id == S.size()) {
      ans += nodes[node_id].num;
      return;
    }
    int nc = S[s_id] - margin;
    dfs(S, s_id + 1, nodes[node_id].ne[nc], st, ans);
    st.insert(S[s_id]);
    for (auto &c : st) {
      int id = nodes[node_id].ne[c - margin];
      if (id != -1)
        nodes[id].num++;
    }
  }

  template <class F> void query(const string &S, F &f) { query(S, f, 0, 0); }

  int count() const { return nodes[0].num; }

  int size() const { return (int)nodes.size(); }
};

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int N;
  cin >> N;
  vec<string> S(N);
  Trie<26, 'a'> trie;
  for (auto &s : S) {
    cin >> s;
    reverse(s.begin(), s.end());
    trie.add(s);
  }
  ll ans = 0;
  sort(S.begin(), S.end(),
       [](string &s, string &t) { return s.size() > t.size(); });
  for (auto &s : S) {
    set<char> st;
    trie.dfs(s, 0, 0, st, ans);
  }
  cout << ans - N << "\\n";
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template <class T> using vec = vector<T>;
template <class T> using vvec = vector<vec<T>>;

template <int char_size, int margin> class Trie {
private:
  struct Node {
    int ne[char_size];
    int cnt[char_size];
    int num;
    vec<int> accept;
    Node() : num(0) { memset(ne, -1, sizeof(ne)); }
  };

  vec<Node> nodes;
  int root;

public:
  Trie() : root(0) { nodes.push_back(Node()); }

  void update_direct(int node, int id) {
    nodes[node].accept.push_back(id);
    nodes[node].num++;
  }

  void update_child(int node, int child) {
    //        nodes[node].num++;
  }

  void add(const string &S, int s_id, int node_id, int id) {
    if (s_id == S.size())
      update_direct(node_id, id);
    else {
      int c = S[s_id] - margin;
      if (nodes[node_id].ne[c] == -1) {
        nodes[node_id].ne[c] = (int)nodes.size();
        nodes.push_back(Node());
      }
      add(S, s_id + 1, nodes[node_id].ne[c], id);
      update_child(node_id, nodes[node_id].ne[c]);
    }
  }

  void add(const string &S, int id) { add(S, 0, 0, id); }

  void add(const string &S) { add(S, nodes[0].num); }

  template <class F> void query(const string &S, F &f, int s_id, int node_id) {
    for (auto &id : nodes[node_id].accept)
      f(id);
    if (s_id == S.size())
      return;
    else {
      int c = S[s_id] - margin;
      if (nodes[node_id].ne[c] == -1)
        return;
      query(S, f, s_id + 1, nodes[node_id].ne[c]);
    }
  }

  void dfs(const string &S, int s_id, int node_id, set<char> &st, ll &ans) {
    if (s_id == S.size()) {
      ans += nodes[node_id].num;
      return;
    }
    int nc = S[s_id] - margin;
    if (nc == -1)
      return;
    dfs(S, s_id + 1, nodes[node_id].ne[nc], st, ans);
    st.insert(S[s_id]);
    for (auto &c : st) {
      int id = nodes[node_id].ne[c - margin];
      if (id != -1)
        nodes[id].num++;
    }
  }

  template <class F> void query(const string &S, F &f) { query(S, f, 0, 0); }

  int count() const { return nodes[0].num; }

  int size() const { return (int)nodes.size(); }
};

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int N;
  cin >> N;
  vec<string> S(N);
  Trie<26, 'a'> trie;
  for (auto &s : S) {
    cin >> s;
    reverse(s.begin(), s.end());
    trie.add(s);
  }
  ll ans = 0;
  sort(S.begin(), S.end(),
       [](string &s, string &t) { return s.size() > t.size(); });
  for (auto &s : S) {
    set<char> st;
    trie.dfs(s, 0, 0, st, ans);
  }
  cout << ans - N << "\\n";
}