第一道自己A掉的AC自动机。
油然生出一种淡淡的成就感。
虽然差不多就是模板级别的。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
char ss[205],s[10005];
int ans[505];
struct node
{
node *fail;
node *next[128];
int count;
int flag;
}*a[100005];
node *root;
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
void Init(node *s)
{
s->fail=NULL;
s->count=0;
s->flag=0;
memset(s->next,0,sizeof(s->next));
return ;
}
void InsertTree(char *s,int k)
{
int ln=strlen(s);
node *p=root,*q;
for(int i=0;i<ln;i++)
{
int t=s[i];
if(p->next[t]!=NULL)
p=p->next[t];
else
{
q=(node *)malloc(sizeof(node));
Init(q);
p->next[t]=q;
p=q;
}
if(i==ln-1) p->count=k;
}
return ;
}
void bfs()
{
int head,tail;
head=tail=0;
a[tail++]=root;
while(head!=tail)
{
node *p;
p=a[head++];
for(int i=0;i<128;i++)
{
if(p->next[i]!=NULL)
{
if(p==root)
p->next[i]->fail=root;
else
{
node *temp;
temp=p->fail;
while(temp!=NULL)
{
if(temp->next[i]!=NULL)
{
p->next[i]->fail=temp->next[i];
break;
}
temp=temp->fail;
}
if(temp==NULL) p->next[i]->fail=root;
}
a[tail++]=p->next[i];
}
}
}
return ;
}
int Que(int k)
{
int cnt=0;
int ln=strlen(s);
node *p=root;
for(int i=0;i<ln;i++)
{
int t=s[i];
while(p->next[t]==NULL&&p!=root)
p=p->fail;
p=p->next[t];
if(p==NULL) p=root;
node *temp;
temp=p;
while(temp!=NULL&&temp->flag!=k)
{
if(temp->count!=0)
ans[cnt++]=temp->count;
if(cnt==3) return cnt;
temp->flag=k;
temp=temp->fail;
}
}
return cnt;
}
int main()
{
int n,m;
scanf("%d",&n);
getchar();
root=(node *)malloc(sizeof(node));
Init(root);
for(int i=1;i<=n;i++)
{
gets(ss);
InsertTree(ss,i);
}
bfs();
scanf("%d",&m);
getchar();
int cnt=0;
for(int i=1;i<=m;i++)
{
int k;
gets(s);
k=Que(i);
if(k==0) continue;
cnt++;
qsort(ans,k,sizeof(ans[0]),cmp);
printf("web %d:",i);
for(int j=0;j<k;j++)
printf(" %d",ans[j]);
printf("\n");
}
printf("total: %d\n",cnt);
return 0;
}