Problem p02589 (C++) — buggy submission, verdict: Memory Limit Exceeded

/*
    author:  Maksim1744
    created: 09.08.2020 15:14:17
*/

#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define ld long double

#define mp make_pair
#define pb push_back
#define eb emplace_back

#define sum(a) (accumulate((a).begin(), (a).end(), 0ll))
#define mine(a) (*min_element((a).begin(), (a).end()))
#define maxe(a) (*max_element((a).begin(), (a).end()))
#define mini(a) (min_element((a).begin(), (a).end()) - (a).begin())
#define maxi(a) (max_element((a).begin(), (a).end()) - (a).begin())
#define lowb(a, x) (lower_bound((a).begin(), (a).end(), (x)) - (a).begin())
#define uppb(a, x) (upper_bound((a).begin(), (a).end(), (x)) - (a).begin())

template <typename T> vector<T> &operator--(vector<T> &v) {
  for (auto &i : v)
    --i;
  return v;
}
template <typename T> vector<T> &operator++(vector<T> &v) {
  for (auto &i : v)
    ++i;
  return v;
}
template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (auto &i : v)
    is >> i;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, vector<T> &v) {
  for (auto &i : v)
    os << i << ' ';
  return os;
}
template <typename T, typename U>
istream &operator>>(istream &is, pair<T, U> &p) {
  is >> p.first >> p.second;
  return is;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, pair<T, U> &p) {
  os << p.first << ' ' << p.second;
  return os;
}
template <typename T, typename U>
pair<T, U> operator-(pair<T, U> a, pair<T, U> b) {
  return mp(a.first - b.first, a.second - b.second);
}
template <typename T, typename U>
pair<T, U> operator+(pair<T, U> a, pair<T, U> b) {
  return mp(a.first + b.first, a.second + b.second);
}
template <typename T, typename U> void umin(T &a, U b) {
  if (a > b)
    a = b;
}
template <typename T, typename U> void umax(T &a, U b) {
  if (a < b)
    a = b;
}

#ifdef HOME
#define TAG_LENGTH 25
#define LR_LEFT left
#define LR_RIGHT right
#define LR_VALUE value
#define LR_SECOND_VALUE mn
#include "C:/C++ libs/print.cpp"
#else
#define showl 42;
#define shows 42;
#define show(...) 42;
#define showm(...) 42;
#define showt(...) 42;
#define printTree(...) 42;
#define printGraph(...) 42;
#define printLRTree(...) 42;
#define printMatrix(...) 42;
#define printWGraph(...) 42;
#define debug if (false)
#endif

struct Node {
  vector<Node *> to;
  vector<int> cnt;
  Node() {
    to.assign(26, nullptr);
    cnt.assign(26, 0);
  }
};

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);

  int n;
  cin >> n;
  Node *root = new Node();
  vector<string> v;
  for (int i = 0; i < n; ++i) {
    string s;
    cin >> s;
    reverse(s.begin(), s.end());
    v.pb(s);
    auto node = root;
    map<char, int> cur;
    for (auto c : s) {
      cur[c]++;
    }
    for (auto c : s) {
      for (auto [c2, tmp] : cur) {
        node->cnt[c2 - 'a']++;
      }
      if (node->to[c - 'a'] == nullptr)
        node->to[c - 'a'] = new Node();
      node = node->to[c - 'a'];
      if ((--cur[c]) == 0)
        cur.erase(c);
    }
  }
  ll ans = 0;
  for (auto s : v) {
    auto node = root;
    char c = s.back();
    s.pop_back();
    for (auto c : s) {
      node = node->to[c - 'a'];
    }
    ans += node->cnt[c - 'a'] - 1;
  }
  cout << ans << endl;

  return 0;
}


Error: MLE

Fixed submission:

/*
    author:  Maksim1744
    created: 09.08.2020 15:14:17
*/

#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define ld long double

#define mp make_pair
#define pb push_back
#define eb emplace_back

#define sum(a) (accumulate((a).begin(), (a).end(), 0ll))
#define mine(a) (*min_element((a).begin(), (a).end()))
#define maxe(a) (*max_element((a).begin(), (a).end()))
#define mini(a) (min_element((a).begin(), (a).end()) - (a).begin())
#define maxi(a) (max_element((a).begin(), (a).end()) - (a).begin())
#define lowb(a, x) (lower_bound((a).begin(), (a).end(), (x)) - (a).begin())
#define uppb(a, x) (upper_bound((a).begin(), (a).end(), (x)) - (a).begin())

template <typename T> vector<T> &operator--(vector<T> &v) {
  for (auto &i : v)
    --i;
  return v;
}
template <typename T> vector<T> &operator++(vector<T> &v) {
  for (auto &i : v)
    ++i;
  return v;
}
template <typename T> istream &operator>>(istream &is, vector<T> &v) {
  for (auto &i : v)
    is >> i;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, vector<T> &v) {
  for (auto &i : v)
    os << i << ' ';
  return os;
}
template <typename T, typename U>
istream &operator>>(istream &is, pair<T, U> &p) {
  is >> p.first >> p.second;
  return is;
}
template <typename T, typename U>
ostream &operator<<(ostream &os, pair<T, U> &p) {
  os << p.first << ' ' << p.second;
  return os;
}
template <typename T, typename U>
pair<T, U> operator-(pair<T, U> a, pair<T, U> b) {
  return mp(a.first - b.first, a.second - b.second);
}
template <typename T, typename U>
pair<T, U> operator+(pair<T, U> a, pair<T, U> b) {
  return mp(a.first + b.first, a.second + b.second);
}
template <typename T, typename U> void umin(T &a, U b) {
  if (a > b)
    a = b;
}
template <typename T, typename U> void umax(T &a, U b) {
  if (a < b)
    a = b;
}

#ifdef HOME
#define TAG_LENGTH 25
#define LR_LEFT left
#define LR_RIGHT right
#define LR_VALUE value
#define LR_SECOND_VALUE mn
#include "C:/C++ libs/print.cpp"
#else
#define showl 42;
#define shows 42;
#define show(...) 42;
#define showm(...) 42;
#define showt(...) 42;
#define printTree(...) 42;
#define printGraph(...) 42;
#define printLRTree(...) 42;
#define printMatrix(...) 42;
#define printWGraph(...) 42;
#define debug if (false)
#endif

struct Node {
  map<char, Node *> to;
  map<char, int> cnt;
};

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);

  int n;
  cin >> n;
  Node *root = new Node();
  vector<string> v;
  for (int i = 0; i < n; ++i) {
    string s;
    cin >> s;
    reverse(s.begin(), s.end());
    v.pb(s);
    auto node = root;
    map<char, int> cur;
    for (auto c : s) {
      cur[c]++;
    }
    for (auto c : s) {
      for (auto [c2, tmp] : cur) {
        node->cnt[c2]++;
      }
      if (!node->to.count(c))
        node->to[c] = new Node();
      node = node->to[c];
      if ((--cur[c]) == 0)
        cur.erase(c);
    }
  }
  ll ans = 0;
  for (auto s : v) {
    auto node = root;
    char c = s.back();
    s.pop_back();
    for (auto c : s) {
      node = node->to[c];
    }
    ans += node->cnt[c] - 1;
  }
  cout << ans << endl;

  return 0;
}