Pagini recente » Cod sursa (job #1534972) | Cod sursa (job #2253062) | Cod sursa (job #1050269) | Cod sursa (job #2664937) | Cod sursa (job #1953468)
// Aho-Corasick.cpp : Defines the entry point for the console application.
//
#include "iostream"
#include "fstream"
#include "vector"
#include "cstring"
using namespace std;
ifstream f("ahocorasick.in");
ofstream g("ahocorasick.out");
const int AlphabetDimension = 26, MaxLength = 1000005, MaxQuery = 10005;
char s[MaxLength], c[MaxQuery];
int n, inc, sf, Final[105];
struct El {
vector < int > Final;
int n0;
El * urm[AlphabetDimension], *fail;
El() {
memset(urm, 0, sizeof(urm));
n0 = 0;
fail = 0;
}
}*q[MaxQuery * MaxQuery], *prim, *p;
void init(El *p, char *c , int i) {
if (!isalpha(*c)) {
p->Final.push_back(i);
return;
}
int poz = *c - 'a';
if (p->urm[poz] == 0) {
p->urm[poz] = new El;
}
init(p->urm[poz], c + 1, i);
}
void BFS(El * prim) {
prim->fail = prim;
inc = sf = 1;
q[1] = prim;
for (; inc <= sf; inc++) {
El * fr = q[inc];
for (int i = 0; i < AlphabetDimension; i++)
if (fr->urm[i] != 0) {
El *fail;
for (fail = fr->fail; fail->urm[i] == 0 && fail != prim; fail = fail->fail);
if (fail->urm[i] != 0 && fail->urm[i] != fr->urm[i]) fail = fail->urm[i];
fr->urm[i]->fail = fail;
q[++sf] = fr->urm[i];
}
}
prim->fail = 0;
}
void AntiBFS(El * prim) {
for (int i = sf; i > 0; i--) {
El *fr = q[i];
if (fr->fail != NULL) fr->fail->n0 += fr->n0;
for (int j = 0; j < fr->Final.size(); j++)
Final[fr->Final[j]] = fr->n0;
}
}
int main()
{
f >> s >> n;
prim = new El;
for (int i = 0; i < n; i++) {
f >> c;
init(prim, c, i);
}
BFS(prim);
p = prim;
int lg = strlen(s);
for (int i = 0; i < lg; i++)
{
int urm = s[i] - 'a';
for (; p->urm[urm] == NULL && p != prim; p = p->fail);
if (p->urm[urm] != NULL) p = p->urm[urm];
++(p->n0);
}
AntiBFS(prim);
for (int i = 0; i < n; i++)
g << Final[i] << '\n';
return 0;
}