好吧 继续悲剧的节奏,自己看看就行咯
#include<iostream>
using namespace std;
char str[11000];
int total, head, tail;
struct node
{
node *next[130];
node *fail;
int cnt, id;
node(){
fail = NULL;
cnt = 0;
for(int i = 0; i < 130; ++i)
next[i] = NULL;
}
}*q[500001];
void insert(node *root, int id)
{
node *p = root;
int i = 0, index;
while(str[i])
{
index = str[i]-31;
if(p->next[index] == NULL) p->next[index] = new node();
p = p->next[index];
i++;
}
p->cnt++;
p->id = id;
}
void build_ac(node *root)
{
root->fail = NULL;
q[head++] = root;
node *p = NULL;
while(head != tail)
{
node *temp = q[tail++];
for(int i = 0; i <= 128; i++)
{
if(temp->next[i]!=NULL)
{
if(temp == root) temp->next[i]->fail = root;
else
{
p = temp->fail;
while(p!=NULL)
{
if(p->next[i]!=NULL)
{
temp->next[i]->fail = p->next[i];
break;
}
p = p->fail;
}
if(p == NULL) temp->next[i]->fail = root;
}
q[head++] = temp->next[i];
}
}
}
}
int cnt;
int ans[1000];
void query(node *root)
{
int i = 0, index;
node *p = root;
while(str[i])
{
index = str[i]-31;
while(p->next[index] == NULL && p!=root) p = p->fail;
p = p->next[index];
if(p == NULL) p = root;
node *temp = p;
while(temp!=root && temp->cnt > 0)
{
if(ans[temp->id] == 0)
{
cnt++;
ans[temp->id] = 1;
}
temp = temp->fail;
}
i++;
}
}
int main()
{
int n, m;
total = 0;
while(scanf("%d",&n)!=EOF)
{
node *root = new node;
total = 0;
head = 0;
tail = 0;
for(int i = 0; i < n; ++i)
{
scanf("%s", str);
insert(root, i+1);
}
scanf("%d",&m);
build_ac(root);
for(int i = 1; i <= m; ++i)
{
memset(ans, 0, sizeof(ans));
cnt = 0;
scanf("%s", str);
query(root);
if(cnt > 0)
{
printf("web %d:", i);
for(int j = 1; j <= 500; j++)
if(ans[j] == 1) printf(" %d", j);
printf("\n");
total++;
}
}
printf("total: %d\n",total);
}
return 0;
}