Pagini recente » Cod sursa (job #3125017) | Cod sursa (job #525241) | Cod sursa (job #269308) | Cod sursa (job #1398272) | Cod sursa (job #2546835)
#include<bits/stdc++.h>
using namespace std;
const int sigma=26;
const int maxN=(1e2)+5;
const int maxL=(1e6)+5;
const int maxM=(1e4)+5;
char s[maxL],a[maxM];
struct trie
{
trie *sons[sigma+5];
trie *backEdge;
int sol;
vector<trie*> v;
trie()
{
sol=0;
for(int i=1;i<=sigma;i++)
sons[i]=NULL;
backEdge=NULL;
v.clear();
}
}*root=new trie();
trie *w[maxN];
inline int f(char c)
{
return c-'a'+1;
}
inline trie* Insert(trie *node,char *s)
{
if(*s==NULL) return node;
int son=f(s[0]);
if(!node->sons[son]) node->sons[son]=new trie();
Insert(node->sons[son],s+1);
}
void dfs(trie *node)
{
for(auto it:node->v)
{
dfs(it);
node->sol+=it->sol;
}
}
int n;
deque<trie*> q;
int main()
{
freopen("ahocorasick.in","r",stdin);
freopen("ahocorasick.out","w",stdout);
scanf("%s",s+1);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("\n");
scanf("%s",a);
w[i]=Insert(root,a);
}
q.push_back(root);
while(!q.empty())
{
trie *node=q.front();
q.pop_front();
for(int i=1;i<=sigma;i++)
{
if(node->sons[i])
{
trie* aux=node->backEdge;
while(aux && !aux->sons[i]) aux=aux->backEdge;
if(aux==NULL) node->sons[i]->backEdge=root;
else node->sons[i]->backEdge=aux->sons[i];
node->sons[i]->backEdge->v.push_back(node->sons[i]);
q.push_back(node->sons[i]);
}
}
}
trie* aux=root;
int m=strlen(s+1);
for(int i=1;i<=m;i++)
{
int son=f(s[i]);
while(aux!=root && !aux->sons[son]) aux=aux->backEdge;
if(aux->sons[son]) aux=aux->sons[son];
aux->sol++;
}
dfs(root);
for(int i=1;i<=n;i++)
printf("%d\n",w[i]->sol);
return 0;
}