1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #include<queue> 5 #define MAXL 256 6 #define MAXN 50010 7 using namespace std; 8 char str[MAXN]; 9 int dg[MAXN], code[MAXN], size; 10 bool vis[MAXN]; 11 struct node { 12 int fail, cnt, next[MAXL]; 13 void Init() { 14 fail = cnt = 0; 15 memset(next, 0, sizeof(next)); 16 } 17 }; 18 node tree[MAXN]; 19 inline int GET(char ch) { 20 if (ch >= 'A' && ch <= 'Z') 21 return ch - 'A'; 22 if (ch >= 'a' && ch <= 'z') 23 return ch - 'a' + 26; 24 if (ch >= '0' && ch <= '9') 25 return ch - '0' + 52; 26 if (ch == '+') 27 return 62; 28 return 63; 29 } 30 void DoIt() { 31 int len, i, j, k, g; 32 vector<int> t; 33 memset(dg, 0, sizeof(dg)); 34 for (len = strlen(str); str[len - 1] == '='; len--) 35 ; 36 str[len] = 0; 37 for (i = 0; i < len; i++) 38 t.push_back(GET(str[i])); 39 for (i = 0; i < t.size(); i++) { 40 for (j = 6 * (i + 1) - 1; j >= 6 * i; j--) { 41 if (t[i] & 1) 42 dg[j] = 1; 43 t[i] >>= 1; 44 } 45 } 46 k = t.size() * 6 / 8; 47 for (i = 0; i < k; i++) { 48 for (g = 0, j = 8 * i; j < 8 * (i + 1); j++) 49 g = (g << 1) + dg[j]; 50 code[i] = g; 51 } 52 code[i] = -1; 53 } 54 void Insert() { 55 int now, t, i; 56 for (now = i = 0; code[i] >= 0; i++) { 57 t = code[i]; 58 if (!tree[now].next[t]) { 59 tree[++size].Init(); 60 tree[now].next[t] = size; 61 } 62 now = tree[now].next[t]; 63 } 64 tree[now].cnt++; 65 } 66 void BFS() { 67 int i, now, p; 68 queue<int> q; 69 q.push(0); 70 while (!q.empty()) { 71 now = q.front(); 72 q.pop(); 73 for (i = 0; i < MAXL; i++) { 74 if (tree[now].next[i]) { 75 p = tree[now].next[i]; 76 if (now) 77 tree[p].fail = tree[tree[now].fail].next[i]; 78 q.push(p); 79 } else 80 tree[now].next[i] = tree[tree[now].fail].next[i]; 81 } 82 } 83 } 84 int Match() { 85 int now, i, t, p, ans; 86 for (ans = now = i = 0; code[i] >= 0; i++) { 87 t = code[i]; 88 now = tree[now].next[t]; 89 for (p = now; p; p = tree[p].fail) { 90 if (!vis[p]) { 91 ans += tree[p].cnt; 92 vis[p] = true; 93 } 94 } 95 } 96 return ans; 97 } 98 int main() { 99 int n, i, q, ans; 100 while (~scanf(" %d", &n)) { 101 tree[0].Init(); 102 for (i = size = 0; i < n; i++) { 103 scanf(" %s", str); 104 DoIt(); 105 Insert(); 106 } 107 BFS(); 108 scanf("%d", &q); 109 while (q--) { 110 memset(vis, false, sizeof(vis)); 111 scanf(" %s", str); 112 DoIt(); 113 ans = Match(); 114 printf("%d\n", ans); 115 } 116 putchar('\n'); 117 } 118 return 0; 119 }