Pagini recente » Cod sursa (job #2275275) | Cod sursa (job #2259088) | Cod sursa (job #2337880) | Cod sursa (job #1000852) | Cod sursa (job #2188281)
#include <bits/stdc++.h>
using namespace std;
struct trie{
trie *f[26], *fail;
vector<int> v;
int occ;
trie(){
occ = 0;
fail = 0;
memset(f, 0, sizeof(f));
}
};
const string fisier = "ahocorasick";
string r, c;
int n, sol[105];
trie *rad = new trie;
int main()
{
ifstream fin (fisier+".in");
ofstream fout (fisier+".out");
fin >> r >> n;
for (int i = 1; i <= n; ++i){
fin >> c;
trie *t = rad;
for (int j = 0; j < c.length(); ++j){
int q = c[j]-'a';
if(t->f[q] == 0)
t->f[q] = new trie;
t = t->f[q];
}
t->v.push_back(i);
}
int vf = -1;
vector<trie*> q;
q.push_back(rad);
rad->fail = rad;
while(vf+1 != q.size()){
trie *t = q[++vf];
for (int i = 0; i < 26; ++i)
if(t->f[i] != 0){
trie *fail = t->fail;
while(fail != rad && fail->f[i] != 0)
fail = fail->fail;
if(fail->f[i] != 0 && fail->f[i] != t->f[i])
fail = fail->f[i];
t->f[i]->fail = fail;
q.push_back(t->f[i]);
}
}
rad->fail = 0;
trie *t = rad;
for (int i = 0; i < r.length(); ++i){
int q = r[i]-'a';
while(t != rad && t->f[q] == 0)
t = t->fail;
if(t->f[q] != 0)
t = t->f[q];
++t->occ;
}
for (int i = vf; i >= 0; --i){
trie *t = q[i];
if(t->fail != 0)
t->fail->occ += t->occ;
for (vector<int>::iterator it = t->v.begin(); it != t->v.end(); ++it)
sol[*it] = t->occ;
}
for (int i = 1; i <= n; ++i)
fout << sol[i] << "\n";
return 0;
}