#include<cstdio>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<iostream>
using namespace std;
#define maxnod 500000
#define sizem 100
set<int> k;
int ch[maxnod][sizem];
int val[maxnod];
int f[maxnod];
int last[maxnod];
int sz;
void clea()
{
memset(ch[0],0,sizeof(ch[0]));
sz=1;
}
int idx(char x){return x-'!';}
void inser(char *s,int v)
{
int n=strlen(s);
int u=0;
for(int i=0;i<n;i++)
{
int c=idx(s[i]);
if(!ch[u][c])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]=v;
}
void getfail()
{
queue<int> q;
//int u=0;
f[0]=0;
for(int c=0;c<sizem;c++)
{
int u=ch[0][c];
if(u)
{
q.push(u);
last[u]=0;
f[u]=0;
}
}
while(!q.empty())
{
int r=q.front();
q.pop();
for(int c=0;c<sizem;c++)
{
int u=ch[r][c];
if(!u)
continue;
f[u]=0;
last[u]=0;
q.push(u);
int j=f[r];
while(j&&!ch[j][c])
j=f[j];
f[u]=ch[j][c];
if(val[f[u]])
last[u]=f[u];
else
last[u]=last[f[u]];
}
}
}
void print(int j)
{
if(j)
{
k.insert(val[j]);
print(last[j]);
}
}
void find(string s)
{
int n=s.length();
int j=0;
for(int i=0;i<n;i++)
{
int c=idx(s[i]);
while(j&&!ch[j][c])
j=f[j];
j=ch[j][c];
if(val[j])
print(j);
else if(last[j])
print(last[j]);
}
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int m,n;
string s;
char s1[205];
while(scanf("%d",&n)!=EOF){
int b=1;
//ans=0;
clea();
for(int i=1;i<=n;i++)
{
scanf("%s",s1);
inser(s1,i);
}
getfail();
// for(int i=0;i<10;i++)
// printf("%d ",val[i]);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
cin>>s;
k.clear();
// memset(ans,0,sizeof(ans));
find(s);
if(k.size())
{
printf("web %d:",i);
b++;
set<int>::iterator it;
for(it=k.begin();it!=k.end();it++)
cout<<" "<<*it;
printf("\n");
}
} printf("total: %d\n",b-1);
}
return 0;
}
hdu 2896 ac自动机
最新推荐文章于 2020-07-27 19:43:52 发布