字母树
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <algorithm>
#include <functional>
#include <utility>
#include <bitset>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstdio>
#include <cstring>
#include <climits>
#include <string.h>
#include <stdio.h>
#define LL long long
#define pii pair<int,int>
#define piii pair<int, pii >
#define REP(i,n) for (int (i)=0;(i)<(n);(i)++)
#define vi vector<int>
#define vpi vector< pii >
#define INF 2147483647
#define big 20160116
#define pb push_back
#define mp make_pair
using namespace std;
int n,m;
typedef struct Trie
{
struct Trie *next[26];
int num;
bool tail;
}Trie;
Trie* makenode()
{
Trie *space=(Trie *)malloc(sizeof(Trie));
space->tail=false;
space->num=0;
memset(space->next,0,sizeof(space->next));
return space;
}
void Trie_insert(Trie *root,char* p)
{
Trie* space=root;
int x;
while (*p!='\0')
{
x=*p-'a';
if (space->next[x]==0)
space->next[x]=makenode();
space=space->next[x];
p++;
space->num++;
}
space->tail=true;
}
int Trie_query(Trie* root,char* s)
{
Trie* space=root;
while (*s)
{
space=space->next[*s-'a'];
s++;
if (space==0) return 0;
}
return space->num;
}
int main()
{
char s[12];
cin>>n;
Trie* root=makenode();
while (n--)
{
cin>>s;
Trie_insert(root,s);
}
cin>>m;
while (m--)
{
cin>>s;
cout<<Trie_query(root,s)<<endl;
}
return 0;
}