Pagini recente » Cod sursa (job #2463353) | Cod sursa (job #2077367) | Cod sursa (job #2646479) | Cod sursa (job #2364024) | Cod sursa (job #980924)
Cod sursa(job #980924)
#include<stdio.h>
#include<cstring>
#include<string>
#include<vector>
#define pb push_back
#define maxn 105
#define maxm 1000005
#define maxs 10005
#define maxch 27
using namespace std;
int n,m,nrs,ql,qr;
int sol[maxn];
char t[maxm],s[maxs];
struct trie
{
int nr;
trie *son[maxch],*fail;
vector <int> l;
trie()
{
nr=0;
fail=NULL;
memset(son,NULL,sizeof(son));
}
} *r,*q[maxn*maxs];
void insert(int number)
{
trie *node=r;
int ind;
for(int i=1;i<=nrs;i++)
{
ind=s[i]-'a';
if(node->son[ind]==NULL) node->son[ind]=new trie();
node=node->son[ind];
}
node->l.pb(number);
}
void read()
{
scanf("%s\n",t+1);
m=strlen(t+1);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s\n",s+1);
nrs=strlen(s+1);
insert(i);
}
}
void bfs()
{
trie *k,*node;
r->fail=r;
for(q[++qr]=r,ql=1;ql<=qr;ql++)
{
k=q[ql];
for(int i=0;i<=25;i++)
if(k->son[i]!=NULL)
{
q[++qr]=k->son[i];
if(k==r) k->son[i]->fail=r;
else
{
for(node=k->fail;node!=r && node->son[i]==NULL;node=node->fail);
k->son[i]->fail=node->son[i];
if(node->son[i]==NULL) k->son[i]->fail=r;
}
}
}
}
void bottomup_bfs()
{
trie *node;
for(int i=qr;i>=1;i--)
{
node=q[i];
if(node!=r) node->fail->nr+=node->nr;
for(unsigned int j=0;j<node->l.size();j++)
sol[node->l[j]]+=node->nr;
}
}
void aho_corasick()
{
trie *node=r;
int ind;
bfs();
for(int i=1;i<=m;i++)
{
ind=t[i]-'a';
for(;node->son[ind]==NULL && node!=r;node=node->fail);
if(node->son[ind]!=NULL) node=node->son[ind];
node->nr++;
}
bottomup_bfs();
}
void print()
{
for(int i=1;i<=n;i++)
printf("%d\n",sol[i]);
}
int main()
{
freopen("ahocorasick.in","r",stdin);
freopen("ahocorasick.out","w",stdout);
r=new trie();
read();
aho_corasick();
print();
fclose(stdin);
fclose(stdout);
return 0;
}