#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int MX = 4e5 + 5;
const int N = 1e5 + 5;
struct Node {
int nxt[26];
int cnt = 0;
bool mark = false;
Node() {
memset(nxt, -1, sizeof nxt);
}
};
int sz;
Node trie[MX];
void addString(const string& s) {
int v = 0;
for (char ch : s) {
int c = ch - 'a';
if (trie[v].nxt[c] == -1) {
trie[v].nxt[c] = ++sz;
}
v = trie[v].nxt[c];
++trie[v].cnt;
}
trie[v].mark = true;
}
int n, q;
string s[N];
int add[N][26][26]; // add[i][c1][c2] = Giả sử c1 < c2, thì cặp (c1, c2) đóng góp vào vị trí sau khi sort của xâu s[i] bao nhiêu
int cnt_pref[N]; // cnt_pref[i] = Số xâu là prefix của xâu s[i]
void precompute() { // O(n + MX * 26)
for (int i = 1; i <= n; i++) {
int v = 0;
for (char ch : s[i]) {
int c = ch - 'a';
for (int c1 = 0; c1 <= 25; c1++) {
if (c1 == c) continue;
int nxt_v = trie[v].nxt[c1];
if (nxt_v == -1) continue;
add[i][c1][c] += trie[nxt_v].cnt;
}
v = trie[v].nxt[c];
cnt_pref[i] += trie[v].mark;
}
}
}
// Vị trí của xâu s[i] sau khi sort, nếu ta tuân theo thứ tự các chữ cái của p
int findIndex(int i, const string& p) { // O(26^2)
int ans = 0;
for (int j = 0; j + 1 <= 25; j++) {
int c1 = p[j] - 'a';
for (int k = j + 1; k <= 25; k++) {
int c2 = p[k] - 'a';
ans += add[i][c1][c2];
}
}
ans += cnt_pref[i];
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> s[i];
addString(s[i]);
}
precompute();
cin >> q;
while (q--) {
int i; string p;
cin >> i >> p;
cout << findIndex(i, p) << '\n';
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE1YID0gNGU1ICsgNTsgCmNvbnN0IGludCBOID0gMWU1ICsgNTsgCgpzdHJ1Y3QgTm9kZSB7CglpbnQgbnh0WzI2XTsgCglpbnQgY250ID0gMDsgIAoJYm9vbCBtYXJrID0gZmFsc2U7IAoKCU5vZGUoKSB7CgkJbWVtc2V0KG54dCwgLTEsIHNpemVvZiBueHQpOyAKCX0KfTsgCgppbnQgc3o7IApOb2RlIHRyaWVbTVhdOyAKCnZvaWQgYWRkU3RyaW5nKGNvbnN0IHN0cmluZyYgcykgewoJaW50IHYgPSAwOyAgCglmb3IgKGNoYXIgY2ggOiBzKSB7CgkJaW50IGMgPSBjaCAtICdhJzsgCgkJaWYgKHRyaWVbdl0ubnh0W2NdID09IC0xKSB7CgkJCXRyaWVbdl0ubnh0W2NdID0gKytzejsgCgkJfQoJCXYgPSB0cmllW3ZdLm54dFtjXTsKCQkrK3RyaWVbdl0uY250OwoJfQoJdHJpZVt2XS5tYXJrID0gdHJ1ZTsgCn0KCmludCBuLCBxOyAgCnN0cmluZyBzW05dOyAKaW50IGFkZFtOXVsyNl1bMjZdOyAvLyBhZGRbaV1bYzFdW2MyXSA9IEdp4bqjIHPhu60gYzEgPCBjMiwgdGjDrCBj4bq3cCAoYzEsIGMyKSDEkcOzbmcgZ8OzcCB2w6BvIHbhu4sgdHLDrSBzYXUga2hpIHNvcnQgY+G7p2EgeMOidSBzW2ldIGJhbyBuaGnDqnUKaW50IGNudF9wcmVmW05dOyAvLyBjbnRfcHJlZltpXSA9IFPhu5EgeMOidSBsw6AgcHJlZml4IGPhu6dhIHjDonUgc1tpXQoKdm9pZCBwcmVjb21wdXRlKCkgeyAvLyBPKG4gKyBNWCAqIDI2KQoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJaW50IHYgPSAwOyAgCgkJZm9yIChjaGFyIGNoIDogc1tpXSkgewoJCQlpbnQgYyA9IGNoIC0gJ2EnOyAgCgkJCWZvciAoaW50IGMxID0gMDsgYzEgPD0gMjU7IGMxKyspIHsKCQkJCWlmIChjMSA9PSBjKSBjb250aW51ZTsgCgkJCQlpbnQgbnh0X3YgPSB0cmllW3ZdLm54dFtjMV07IAoJCQkJaWYgKG54dF92ID09IC0xKSBjb250aW51ZTsgICAKCQkJCWFkZFtpXVtjMV1bY10gKz0gdHJpZVtueHRfdl0uY250OyAgIAoJCQl9CgkJCXYgPSB0cmllW3ZdLm54dFtjXTsKCQkJY250X3ByZWZbaV0gKz0gdHJpZVt2XS5tYXJrOyAgCgkJfQoJfQp9CgovLyBW4buLIHRyw60gY+G7p2EgeMOidSBzW2ldIHNhdSBraGkgc29ydCwgbuG6v3UgdGEgdHXDom4gdGhlbyB0aOG7qSB04buxIGPDoWMgY2jhu68gY8OhaSBj4bunYSBwCmludCBmaW5kSW5kZXgoaW50IGksIGNvbnN0IHN0cmluZyYgcCkgeyAvLyBPKDI2XjIpCglpbnQgYW5zID0gMDsKCWZvciAoaW50IGogPSAwOyBqICsgMSA8PSAyNTsgaisrKSB7CgkJaW50IGMxID0gcFtqXSAtICdhJzsKCQlmb3IgKGludCBrID0gaiArIDE7IGsgPD0gMjU7IGsrKykgewoJCQlpbnQgYzIgPSBwW2tdIC0gJ2EnOyAgCgkJCWFucyArPSBhZGRbaV1bYzFdW2MyXTsgCgkJfQoJfQoKCWFucyArPSBjbnRfcHJlZltpXTsgCgoJcmV0dXJuIGFuczsgCn0KCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAkKCWNpbiA+PiBuOyAKCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewoJCWNpbiA+PiBzW2ldOyAKCQlhZGRTdHJpbmcoc1tpXSk7IAoJfQoKCXByZWNvbXB1dGUoKTsgICAKCgljaW4gPj4gcTsgCgoJd2hpbGUgKHEtLSkgewoJCWludCBpOyBzdHJpbmcgcDsgIAoJCWNpbiA+PiBpID4+IHA7ICAKCQljb3V0IDw8IGZpbmRJbmRleChpLCBwKSA8PCAnXG4nOyAJCgl9Cn0=
NQphYQphYmJhYQphYmJiYQphYWFiCmFhYWFhYmEKNQoxIGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6CjIgYmFjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoKMyBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ego0IGJhY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6CjUgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoK
5
aa
abbaa
abbba
aaab
aaaaaba
5
1 abcdefghijklmnopqrstuvwxyz
2 bacdefghijklmnopqrstuvwxyz
3 abcdefghijklmnopqrstuvwxyz
4 bacdefghijklmnopqrstuvwxyz
5 abcdefghijklmnopqrstuvwxyz