#include<bits/stdc++.h>
#define ll long long
#define nl "\n"
#define all(v) v.begin(),v.end()
#define baraa ios_base::sync_with_stdio(false);cin.tie(NULL);
using namespace std;
bool check(string &s, string &suffix) {
    ll n = s.size(), m = suffix.size(), i = n - 1, j = m - 1;
    while (i >= 0 && j >= 0) {
        if (s[i] != suffix[j])return 0;
        i--, j--;
    }
    return (j == -1);
}
struct node {
    map<char, ll> mp;
    vector<string> a;
    vector<pair<string, ll> > qu;
    ll ends = 0;
    ll &operator[](char c) {
        return mp[c];
    }
    void insS(string s) {
        a.push_back(s);
    }
    void insQ(string s, ll idx) {
        qu.push_back({s, idx});
    }
};
struct Trie {
    vector<node> tree;
    ll newNode() {
        tree.emplace_back();
        return tree.size() - 1;
    }
    Trie() {
        tree.clear();
        newNode();
    }
    void insert(string s) {
        ll u = 0;
        for (auto c: s) {
            if (!tree[u][c])
                tree[u][c] = newNode();
            u = tree[u][c];
        }
        tree[u].insS(s);
    }
    void query(string prefix, string suffix, ll idx) {
        ll u = 0;
        for (auto c: prefix) {
            if (!tree[u][c])return;
            u = tree[u][c];
        }
        tree[u].insQ(suffix, idx);
    }
    void dfs(ll u, vector<ll> &res) {
        for (auto [ch, v]: tree[u].mp) {
            if (!v)continue;
            dfs(v, res);
            if (tree[u].a.size() < tree[v].a.size())swap(tree[u].a, tree[v].a);
            for (auto s: tree[v].a)tree[u].a.push_back(s);
        }
        for (auto &[suffix, idx]: tree[u].qu) {
            for (auto &s: tree[u].a)
                res[idx] += check(s, suffix);
        }
    }
};
int main() {
    baraa
    ll n, q;
    cin >> n >> q;
    Trie trie;
    for (ll i = 0; i < n; i++) {
        string s;
        cin >> s;
        trie.insert(s);
    }
    vector<ll> res(q);
    for (ll i = 0; i < q; i++) {
        string prefix, suffix;
        cin >> prefix >> suffix;
        trie.query(prefix, suffix, i);
    }
    trie.dfs(0, res);
    for (ll i: res)cout << i << nl;
    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... |