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 }
posted on 2012-08-03 22:23  DrunBee  阅读(687)  评论(0编辑  收藏  举报