/*
分析:
AC自动机果题。
蛋疼,才几天没敲题,就连续犯俩同样的错误,都是很
显然的数组开小了,1wa囧~。。。
2013-04-08
*/
分析:
AC自动机果题。
蛋疼,才几天没敲题,就连续犯俩同样的错误,都是很
显然的数组开小了,1wa囧~。。。
2013-04-08
*/
#include"iostream"
#include"cstdio"
#include"cstring"
#include"algorithm"
using namespace std;
const int kind=100;
const int N=505;
const int M=10011;
struct node
{
node *child[kind];
node *fail;
int index;
void init()
{
int l;
for(l=0;l<kind;l++) child[l]=NULL;
fail=NULL;
index=0;
}
}*q[200*N];
node *root;
int head,tail;
void insert(char *str,int id)
{
node *now,*next;
int i=0,t;
now=root;
while(str[i])
{
t=str[i]-' ';
if(now->child[t]!=NULL) now=now->child[t];
else
{
next=new node;
next->init();
now->child[t]=next;
now=next;
}
i++;
}
now->index=id;
}
void build_fail()
{
int l;
node *now,*p;
head=tail=0;
now=root;
q[tail++]=now;
while(head<tail)
{
now=q[head];
for(l=0;l<kind;l++)
{
if(now->child[l]==NULL) continue;
if(now==root) now->child[l]->fail=root;
else
{
p=now->fail;
while(p!=NULL)
{
if(p->child[l]!=NULL)
{
now->child[l]->fail=p->child[l];
break;
}
p=p->fail;
}
if(p==NULL) now->child[l]->fail=root;
}
q[tail++]=now->child[l];
}
head++;
}
}
int ss[2*N][3],k[2*N];
void query(char *str,int zz)
{
node *now,*temp;
int i,t;
int flag[N]; //这个地方我开了一个500的数组来做标记,浪费了不少时间,可以不这样做的,不过这样省点儿事儿- -I。
i=k[zz]=0;
now=root;
memset(flag,0,sizeof(flag));
while(str[i])
{
t=str[i]-' ';
while(now->child[t]==NULL && now!=root) now=now->fail;
now=now->child[t];
if(now==NULL) now=root;
temp=now;
while(temp!=NULL && !flag[temp->index])
{
if(temp->index)
{
ss[zz][k[zz]++]=temp->index;
flag[temp->index]=1;
}
temp=temp->fail;
}
if(k[zz]>=3) break;
i++;
}
}
int main()
{
int n,m;
int i,l;
int cnt;
char str1[205],str2[M];
while(scanf("%d",&n)!=-1)
{
root=new node;
root->init();
for(i=1;i<=n;i++) {scanf("%s",str1);insert(str1,i);}
build_fail();
cnt=0;
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%s",str2);
query(str2,i);
if(k[i]) {sort(ss[i],ss[i]+k[i]);cnt++;}
}
for(i=1;i<=m;i++)
{
if(!k[i]) continue;
printf("web %d:",i);
for(l=0;l<k[i];l++) printf(" %d",ss[i][l]);
printf("\n");
}
printf("total: %d\n",cnt);
}
return 0;
}