Pagini recente » Cod sursa (job #1342480) | Cod sursa (job #1289440) | Cod sursa (job #2338542) | Cod sursa (job #2114456) | Cod sursa (job #2523203)
#include <fstream>
#include <vector>
#include <deque>
#define fiu f[*s-'a']
using namespace std;
ifstream fin("ahocorasick.in");
ofstream fout("ahocorasick.out");
struct trie{
int sol=0;
trie *f[26], *back=0;
vector<trie *> v;
trie() {
for (int i=0;i<26;i++)
f[i]=0;
v.clear();
}
};
char A[1000010],s[10010];
int n,i;
deque<trie *> q;
trie *root=new trie();
trie *w[110],*nod,*aux;
trie *add(trie *r, char *s) {
if (*s==0)
return r;
if (r->fiu==nullptr)
r->fiu=new trie;
return add(r->fiu,s+1);
}
void dfs(trie *nod) {
for (int i=0;i<nod->v.size();i++) {
dfs(nod->v[i]);
nod->sol+=nod->v[i]->sol;
}
}
int main() {
fin>>A;
fin>>n;
for (i=1;i<=n;i++) {
fin>>s;
w[i]=add(root,s);
}
q.push_back(root);
while (!q.empty()) {
nod=q.front();
q.pop_front();
for (i=0;i<26;i++) {
if (nod->f[i]) {
aux=nod->back;
while (aux&&aux->f[i]==nullptr)
aux=aux->back;
if (aux==0)
nod->f[i]->back=root;
else
nod->f[i]->back=aux->f[i];
nod->f[i]->back->v.push_back(nod->f[i]);
q.push_back(nod->f[i]);
}
}
}
aux=root;
for (i=0;A[i]!=0;i++) {
while (aux!=root&&aux->f[A[i]-'a']==nullptr)
aux=aux->back;
if (aux->f[A[i]-'a']!=nullptr)
aux=aux->f[A[i]-'a'];
aux->sol++;
}
dfs(root);
for (i=1;i<=n;i++)
fout<<w[i]->sol<<"\n";
return 0;
}