Problem p03974 (C++)

Buggy submission (status: Runtime Error):
#pragma comment(linker, "/STACK:102400000,102400000")
#include <bits/stdc++.h>
using namespace std;
#define vi vector<int>
#define pii pair<int, int>
#define pb push_back
#define mp make_pair
#define all(x) x.begin(), x.end()
#define SZ(x) (int)(x.size())
#define rep(i, a, b) for (int i = a; i < b; i++)
#define per(i, a, b) for (int i = b - 1; i >= a; i--)
#define inf 1000000007
#define mod 1000000007
#define x first
#define y second
#define pi acos(-1.0)
#define DBG(x) cerr << (#x) << "=" << x << "\n";
// #define dprintf(...)
#define hash _hash
#define next _next
// #define dprintf(...) fprintf(outFile,__VA_ARGS__)

#define FOREACH(it, x)                                                         \
  for (__typeof(x.begin()) it = x.begin(); it != x.end(); it++)
#define ull unsigned long long
#define ll long long
#define N 400010

template <class T, class U> inline void Max(T &a, U b) {
  if (a < b)
    a = b;
}
template <class T, class U> inline void Min(T &a, U b) {
  if (a > b)
    a = b;
}

// FILE* outFile;
inline void add(int &a, int b) {
  a += b;
  while (a >= mod)
    a -= mod;
}

int pow(int a, int b) {
  int ans = 1;
  while (b) {
    if (b & 1)
      ans = ans * (ll)a % mod;
    a = (ll)a * a % mod;
    b >>= 1;
  }
  return ans;
}

int ch[N][26], sz, cnt[N], w[N], pre[N], c[N], a[N], sum[26][26];
char s[N >> 2], t[26];
int add(string s, int id) {
  int n = s.size(), p = 0;
  rep(i, 0, n) {
    int j = s[i] - 'a';
    if (!ch[p][j]) {
      ch[p][j] = ++sz;
      pre[sz] = p;
      c[sz] = j;
    }
    p = ch[p][j];
    cnt[p]++;
  }
  w[p]++;
  return p;
}
void cal(int p) {
  while (p) {
    rep(i, 0, 26) if (i != c[p]) { sum[i][c[p]] += cnt[ch[pre[p]][i]]; }
    sum[c[p]][c[p]] += w[p];
    p = pre[p];
  }
}
struct node {
  string t;
  int id;
};
vector<node> q[N >> 2];
int ans[N >> 2];
int main() {
  int i, j, k, ca = 0, n = 0, m, K;
  scanf("%d", &n);
  rep(i, 0, n) {
    scanf("%s", s);
    a[i] = add(s, i);
  }
  scanf("%d", &m);
  rep(k, 0, m) {
    scanf("%d%s", &i, t);
    i--;
    q[i].pb((node){(string)t, k});
  }
  rep(i, 0, n) if (SZ(q[i])) {
    memset(sum, 0, sizeof(sum));
    cal(a[i]);
    FOREACH(it, q[i]) {
      int tot = 0;
      rep(j, 0, 26) {
        string &t = it->t;
        rep(k, j, 26) tot += sum[t[j] - 'a'][t[k] - 'a'];
      }
      ans[it->id] = tot;
    }
  }
  rep(i, 0, m) printf("%d\n", ans[i]);
  return 0;
}


Fixed submission:
#pragma comment(linker, "/STACK:102400000,102400000")
#include <bits/stdc++.h>
using namespace std;
#define vi vector<int>
#define pii pair<int, int>
#define pb push_back
#define mp make_pair
#define all(x) x.begin(), x.end()
#define SZ(x) (int)(x.size())
#define rep(i, a, b) for (int i = a; i < b; i++)
#define per(i, a, b) for (int i = b - 1; i >= a; i--)
#define inf 1000000007
#define mod 1000000007
#define x first
#define y second
#define pi acos(-1.0)
#define DBG(x) cerr << (#x) << "=" << x << "\n";
// #define dprintf(...)
#define hash _hash
#define next _next
// #define dprintf(...) fprintf(outFile,__VA_ARGS__)

#define FOREACH(it, x)                                                         \
  for (__typeof(x.begin()) it = x.begin(); it != x.end(); it++)
#define ull unsigned long long
#define ll long long
#define N 400010

template <class T, class U> inline void Max(T &a, U b) {
  if (a < b)
    a = b;
}
template <class T, class U> inline void Min(T &a, U b) {
  if (a > b)
    a = b;
}

// FILE* outFile;
inline void add(int &a, int b) {
  a += b;
  while (a >= mod)
    a -= mod;
}

int pow(int a, int b) {
  int ans = 1;
  while (b) {
    if (b & 1)
      ans = ans * (ll)a % mod;
    a = (ll)a * a % mod;
    b >>= 1;
  }
  return ans;
}

int ch[N][26], sz, cnt[N], w[N], pre[N], c[N], a[N], sum[26][26];
char s[N], t[26];
int add(string s, int id) {
  int n = s.size(), p = 0;
  rep(i, 0, n) {
    int j = s[i] - 'a';
    if (!ch[p][j]) {
      ch[p][j] = ++sz;
      pre[sz] = p;
      c[sz] = j;
    }
    p = ch[p][j];
    cnt[p]++;
  }
  w[p]++;
  return p;
}
void cal(int p) {
  while (p) {
    rep(i, 0, 26) if (i != c[p]) { sum[i][c[p]] += cnt[ch[pre[p]][i]]; }
    sum[c[p]][c[p]] += w[p];
    p = pre[p];
  }
}
struct node {
  string t;
  int id;
};
vector<node> q[N >> 2];
int ans[N >> 2];
int main() {
  int i, j, k, ca = 0, n = 0, m, K;
  scanf("%d", &n);
  rep(i, 0, n) {
    scanf("%s", s);
    a[i] = add(s, i);
  }
  scanf("%d", &m);
  rep(k, 0, m) {
    scanf("%d%s", &i, t);
    i--;
    q[i].pb((node){(string)t, k});
  }
  rep(i, 0, n) if (SZ(q[i])) {
    memset(sum, 0, sizeof(sum));
    cal(a[i]);
    FOREACH(it, q[i]) {
      int tot = 0;
      rep(j, 0, 26) {
        string &t = it->t;
        rep(k, j, 26) tot += sum[t[j] - 'a'][t[k] - 'a'];
      }
      ans[it->id] = tot;
    }
  }
  rep(i, 0, m) printf("%d\n", ans[i]);
  return 0;
}