Cod sursa(job #1953463)

Utilizator bt.panteaPantea Beniamin bt.pantea Data 4 aprilie 2017 20:38:20
Problema Aho-Corasick Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
// 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 = 100005, 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;
}