This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std ;
#define ff    first
#define ss    second
#define pb    push_back
typedef long long    ll;
typedef pair<ll,ll>    ii;
typedef long double    lf;
const int N = 5e6;
const static int alpha = 26;
int trie[N][alpha], fail[N], nodes;
int matches[N];
vector <int> end_word[N];
int ans[N];
stack<int> st;
void add(string &s, int i) {
  int cur = 0;
  for(char c : s) {
    int x = c-'A';
    if(!trie[cur][x]) trie[cur][x] = ++nodes;
    cur = trie[cur][x];
  }
  //cnt_word[cur]++;
  end_word[cur].pb(i); // for i > 0
}
void build() {
  queue<int> q; q.push(0);
  while(q.size()) {
    int u = q.front(); q.pop();
    st.push(u);
    for(int i = 0; i < alpha; ++i) {
      int v = trie[u][i];
      if(!v) trie[u][i] = trie[ fail[u] ][i]; // construir automata
      else q.push(v);
      if(!u || !v) continue;
      fail[v] = trie[ fail[u] ][i];
      //fail_out[v] = end_word[ fail[v] ] ? fail[v] : fail_out[ fail[v] ];
      //cnt_word[v] += cnt_word[ fail[v] ]; // obtener informacion del fail_padre
    }
  }
}
void prop() { 
  while (st.size()) { 
     int u = st.top(); st.pop();
     for (auto &e : end_word[u]) ans[e] = matches[u];
     matches[fail[u]]+=matches[u];
  }
}
int main() {
  #ifdef LOCAL
  freopen("input.txt","r",stdin);
//  freopen("output.txt","w",stdout);
  #endif // LOCAL
  ios_base::sync_with_stdio(0);
  cin.tie(0);cout.tie(0);
  
  int n, m; cin >> n >> m;
  //return 0;
  vector <string> s(n);
  for (auto &e : s) cin >> e;
  
  for (int i = 0; i < m; ++i) { 
     string prf, suf;
     cin >> prf >> suf;
     suf.pb('Z');
     suf = suf + prf;
     add(suf, i);
  }
  build();
  for (int i = 0; i < n; ++i) { 
     s[i] = s[i] + "Z" + s[i];
     int node = 0;
     for (auto &e : s[i]) 
        node = trie[node][e - 'A'], matches[node]++;
  }
  prop();
  
  for (int i = 0; i < m; ++i) cout << ans[i] << '\n';
  
  return 0;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |