#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<queue>
using namespace std;
const int maxm=130;
int ans[1111][5];
char str[1111111];
int id,vis[1111],a[1111];
struct node
{
int count;
struct node *next[130];
struct node *fail;
void init()
{
int i;
for(i=0;i<maxm;i++)
next[i]=NULL;
count=0;
fail=NULL;
}
}*root;
void insert();
void getfail();
void query();
void deal(node *t);
int main()
{
int n,i,j,k,m;
while(scanf("%d",&n)!=EOF)
{
root = new node;
root -> fail=NULL;
root -> init();
for(i=1;i<=n;i++)
{
scanf("%s",str);
id=i;
insert();
}
getfail();
scanf("%d",&m);
memset(ans,0,sizeof(ans));
for(i=1;i<=m;i++)
{
memset(vis,0,sizeof(vis));
id=i;
scanf("%s",str);
query();
}
int cnt=0;
for(i=1;i<=m;i++)
{
if(ans[i][0]>=1)
{
cnt++;
printf("web %d:",i);
int a[1111];
memset(a,0,sizeof(a));
for(j=0;ans[i][j]>=1;j++)
a[ans[i][j]]=1;
int k;
for(k=1;k<1100;k++)
{
if(a[k])
printf(" %d",k);
}
printf("\n");
}
}
printf("total: %d\n",cnt);
deal(root);
}
return 0;
}
void insert()
{
int len,k,i,ip;
node *p=root;
len=strlen(str);
for(i=0;i<len;i++)
{
ip=str[i]-31;
if(p->next[ip]==NULL)
{
p->next[ip]=new node;
p->next[ip]->init();
p=p->next[ip];
}
else
p=p->next[ip];
}
p->count=id;
}
void getfail()
{
int i,j,k;
node *p,*temp,*son;
queue<struct node *>q;
q.push(root);
p=root;
while(!q.empty())
{
temp=q.front();
q.pop();
for(i=0;i<maxm;i++)
{
son=temp->next[i];
if(son!=NULL)
{
if(temp==root)
son->fail=root;
else
{
p=temp->fail;
while(p)
{
if(p->next[i]!=NULL)
{
son->fail=p->next[i];
break;
}
p=p->fail;
}
if(p==NULL)
son->fail=root;
}
q.push(son);
}
}
}
}
void query()
{
int len,i,cnt=0,ip;
len=strlen(str);
node *p,*temp;
p=root;
for(i=0;i<len;i++)
{
ip=str[i]-31;
while(!p->next[ip] && p!=root)
p=p->fail;
p=p->next[ip];
temp=p;
while(temp!=root)
{
if(temp->count>=1 && !vis[temp->count])
{
ans[id][cnt++]=temp->count;
vis[temp->count]=1;
}
temp=temp->fail;
}
}
}
void deal(node *t)
{
if(t==NULL)
return;
for(int i=0;i<maxm;i++)
{
if(t->next[i]!=NULL)
deal(t->next[i]);
}
free(t);
}
08-13
09-27
09-27