#include<bits/stdc++.h>
using namespace std;
#define IO ios::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL);
typedef long long ll;
const int N = 26 , mod = 1e9+7;
string ans , result;
ll mx = -1;
struct trie
{
trie * child[N];
bool leaf;
ll Nleafs;
ll exist;
ll count;
trie()
{
memset(child,0,sizeof child);
leaf = 0;
exist = 0;
count = 0;
Nleafs = 0;
}
};
void add(trie * node , string s)
{
trie * renode = node;
for (int i=0;i<s.size();i++)
{
int cur = s[i]-‘a’;
if (node->child[cur] == 0)node->child[cur] = new trie();
node->child[cur]->exist++;
node = (node->child[cur]);
}
node->leaf = 1;
node->Nleafs++;
for (int i=0;i<s.size();i++)
{
int cur = s[i]-'a';
renode->child[cur]->count = node->Nleafs;
renode = (renode->child[cur]);
}
}
void query(trie * node)
{
if (node == 0)return;
if (node->leaf)
{
if (node->Nleafs > mx)
{
result = ans;
mx = node->Nleafs;
}
}
int k = 0 , val = -1;
for (int i=0;i<N;i++)
{
if (node->child[i] != 0 && node->child[i]->count > val)
{
k = i;
val = node->child[i]->count;
}
}
if (val == -1)return;
ans+=(k+'a');
query(node->child[k]);
}
ll get_Max(trie* node , string s)
{
for (int i=0;i<s.size();i++)
{
int cur = s[i]-'a';
if (node->child[cur] == 0)return -1;
node = (node->child[cur]);
}
query(node);
return mx;
}
int main() {
IO
int n;
cin >> n;
string s;
trie * root = new trie();
for (int i=0;i<n;i++)
{
cin >> s;
add(root,s);
}
int m;
cin >> m;
for (int i=0;i<m;i++)
{
cin >> s;
ans = s;
ll res = get_Max(root,s);
if (res != -1)cout << result << " ";
cout << mx << “\n”;
result = “”;
ans = “”;
mx = -1;
}
return 0;
}