#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i!=-1;i=next[i])
using namespace std;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,1,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘;
return x*f;
}
const int maxn=100010;
const int maxnode=300010;
int first[maxnode],next[maxnode],val[maxnode],Pos[maxn],tot;
int ch[maxnode][26],cnt;
void insert(char* s,int v) {
int j=0,c;
for(int i=0;s[i];i++) {
c=s[i]-‘a‘;
if(!ch[j][c]) ch[j][c]=++cnt;
j=ch[j][c];
}
val[++tot]=v;Pos[v]=j;next[tot]=first[j];first[j]=tot;
}
int q[maxnode],f[maxnode],last[maxnode];
int First[maxnode],Next[maxnode],to[maxnode],e;
void AddEdge(int u,int v) {
to[++e]=v;Next[e]=First[u];First[u]=e;
}
void getfail() {
int l=1,r=0;
rep(c,0,25) if(ch[0][c]) q[++r]=ch[0][c];
while(l<=r) {
int x=q[l++];
rep(c,0,25) if(ch[x][c]) {
int u=ch[x][c],j=f[x];q[++r]=u;
while(j&&!ch[j][c]) j=f[j];
f[u]=ch[j][c];last[u]=first[f[u]]?f[u]:last[f[u]];
}
}
rep(i,1,cnt) if(first[i]) AddEdge(last[i],i);
}
char s[maxnode];
int ls[maxn*20],rs[maxn*20],siz[maxn*20],ToT,L[maxnode],R[maxnode];
int root[maxnode],cur;
void build(int& y,int x,int l,int r,int pos) {
siz[y=++ToT]=siz[x]+1;if(l==r) return;
int mid=l+r>>1;ls[y]=ls[x];rs[y]=rs[x];
if(pos<=mid) build(ls[y],ls[x],l,mid,pos);
else build(rs[y],rs[x],mid+1,r,pos);
}
int query(int y,int x,int l,int r,int k) {
if(siz[y]-siz[x]<k) return -1;
if(l==r) return l;
int mid=l+r>>1,k2=siz[ls[y]]-siz[ls[x]];
if(k<=k2) return query(ls[y],ls[x],l,mid,k);
return query(rs[y],rs[x],mid+1,r,k-k2);
}
void dfs(int x) {
for(int i=first[x];i;i=next[i]) {
cur++;if(!L[x]) L[x]=cur;
build(root[cur],root[cur-1],1,100000,val[i]);
}
for(int i=First[x];i;i=Next[i]) dfs(to[i]);
R[x]=cur;
}
int main() {
int n=read();
rep(i,1,n) scanf("%s",s),insert(s,i);
getfail();dfs(0);
rep(i,1,n) printf("%d\n",query(root[R[Pos[i]]],root[L[Pos[i]]-1],1,100000,read()));
return 0;
}