Problem p03974 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
#define FOR(i, a, b) for (ut i = (a); i < (ut)(b); i++)
#define REP(i, b) FOR(i, 0, b)
#define ALL(c) c.begin(), c.end()
#define PB push_back
#define cat // cout << __LINE__ << endl;
using namespace std;
typedef long long LL;
typedef double ld;
typedef int ut;
typedef complex<int> cli;
typedef vector<ut> VI;
typedef pair<ut, ut> pr;
typedef pair<ut, pr> ppr;
typedef vector<pr> Vpr;
typedef vector<ppr> Vppr;
typedef priority_queue<pr, Vpr> PQ;
const int SIZE = 5 + 1e5;
const int alpha = 'z' - 'a' + 1;
int nums[SIZE][alpha][alpha];
int smaller[SIZE];
string s[SIZE];
struct node {
  node *next[alpha];
  bool maked[alpha];
  bool isEnd;
  int size;
  void init() {
    size = 0;
    isEnd = false;
    REP(i, alpha) maked[i] = false;
  }
};
node root;
node nodes[SIZE * 10];
int nextnode = 1;
node *getnext(node *now, int x, bool unmake = false) {
  if (now->maked[x])
    return now->next[x];
  if (unmake)
    return &nodes[0];
  now->maked[x] = true;
  now->next[x] = &nodes[nextnode++];
  now->next[x]->init();
  return now->next[x];
}
void add(int x) {
  node *now = &root;
  REP(i, s[x].size()) {
    now->size++;
    now = getnext(now, s[x][i] - 'a');
  }

  now->isEnd = true;
  now->size++;
}
void analys(int x) {
  node *now = &root;
  REP(i, s[x].size()) {
    if (now->isEnd)
      smaller[x]++;
    FOR(j, 'a', 'z' + 1) {
      if (s[x][i] == j)
        continue;
      nums[x][j - 'a'][s[x][i] - 'a'] += getnext(now, j - 'a', true)->size;
    }
    now = getnext(now, s[x][i] - 'a', true);
  }
}
bool isFaster(string p, char a, char b) {
  REP(i, p.size()) {
    if (p[i] == a)
      return true;
    if (p[i] == b)
      return false;
  }
}
int solve(int x, string p) {
  int ans = 0;
  REP(i, alpha) REP(j, alpha) {
    if (isFaster(p, i + 'a', j + 'a'))
      ans += nums[x][i][j];
    // if(nums[x][i][j])cout << x <<" " <<  char(i+'a') <<" " << char(j+'a') <<
    // " " << nums[x][i][j] << endl;
  }
  return ans + smaller[x];
}
int main() {
  int N;
  cin.tie(0);
  cin >> N;
  REP(i, SIZE * 10) nodes[i].init();
  REP(i, N) {
    cin >> s[i];
    add(i);
  }
  REP(i, N) { analys(i); }
  int Q, k;
  cin >> Q;
  string p;
  REP(i, Q) {
    cin >> k >> p;
    cout << solve(k - 1, p) + 1 << endl;
  }
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
#define FOR(i, a, b) for (ut i = (a); i < (ut)(b); i++)
#define REP(i, b) FOR(i, 0, b)
#define ALL(c) c.begin(), c.end()
#define PB push_back
#define cat // cout << __LINE__ << endl;
using namespace std;
typedef long long LL;
typedef double ld;
typedef int ut;
typedef complex<int> cli;
typedef vector<ut> VI;
typedef pair<ut, ut> pr;
typedef pair<ut, pr> ppr;
typedef vector<pr> Vpr;
typedef vector<ppr> Vppr;
typedef priority_queue<pr, Vpr> PQ;
const int SIZE = 5 + 1e5;
const int alpha = 'z' - 'a' + 1;
int nums[SIZE][alpha][alpha];
int smaller[SIZE];
string s[SIZE];
struct node {
  node *next[alpha];
  bool maked[alpha];
  bool isEnd;
  int size;
  void init() {
    size = 0;
    isEnd = false;
    REP(i, alpha) maked[i] = false;
  }
};
node root;
node nodes[SIZE * 10];
int nextnode = 1;
node *getnext(node *now, int x, bool unmake = false) {
  if (now->maked[x])
    return now->next[x];
  if (unmake)
    return &nodes[0];
  now->maked[x] = true;
  now->next[x] = &nodes[nextnode++];
  now->next[x]->init();
  return now->next[x];
}
void add(int x) {
  node *now = &root;
  REP(i, s[x].size()) {
    now->size++;
    now = getnext(now, s[x][i] - 'a');
  }

  now->isEnd = true;
  now->size++;
}
void analys(int x) {
  node *now = &root;
  REP(i, s[x].size()) {
    if (now->isEnd)
      smaller[x]++;
    FOR(j, 'a', 'z' + 1) {
      if (s[x][i] == j)
        continue;
      nums[x][j - 'a'][s[x][i] - 'a'] += getnext(now, j - 'a', true)->size;
    }
    now = getnext(now, s[x][i] - 'a', true);
  }
}
bool isFaster(string p, char a, char b) {
  REP(i, p.size()) {
    if (p[i] == a)
      return true;
    if (p[i] == b)
      return false;
  }
}
int solve(int x, string p) {
  int ans = 0;
  REP(i, alpha) REP(j, i) {
    ans += nums[x][p[j] - 'a'][p[i] - 'a'];
    // if(nums[x][i][j])cout << x <<" " <<  char(i+'a') <<" " << char(j+'a') <<
    // " " << nums[x][i][j] << endl;
  }
  return ans + smaller[x];
}
int main() {
  int N;
  cin.tie(0);
  cin >> N;
  REP(i, SIZE * 10) nodes[i].init();
  REP(i, N) {
    cin >> s[i];
    add(i);
  }
  REP(i, N) { analys(i); }
  int Q, k;
  cin >> Q;
  string p;
  REP(i, Q) {
    cin >> k >> p;
    cout << solve(k - 1, p) + 1 << endl;
  }
  return 0;
}