Cod sursa(job #719304)

Utilizator marius135Dumitran Adrian Marius marius135 Data 21 martie 2012 18:29:01
Problema Aho-Corasick Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<stdio.h>
#include<string.h>
#include<vector>
#include<string>

using namespace std;

#define maxn (1<<20)
char sir[maxn];

struct trie_node{ 
	bool final;
	int children[26];
	int tata;
	trie_node() {
		final = false;
		memset(children, 0, sizeof(children));
	};
	
};
struct trie{ 
	vector <trie_node> nodes;
	int rad;
	trie() {
		trie_node a;
		nodes.push_back(a);
		nodes.push_back(a);
		rad = 1;
	}
	void add(char *);
};

void trie:: add( char *cuvant) {
	
	int nod_act = rad;
	string cuv(cuvant);
	int len = cuv.size();
	int i = 0;
	while( nodes[nod_act].children[cuv[i]-'a'] != 0 ) {
		nod_act = nodes[nod_act].children[cuv[i]-'a'];
		i++;
	}
	for( ; i < len; ++i) {
		trie_node a;
		a.tata = nod_act;
		nodes.push_back(a);
		nodes[nod_act].children[cuv[i]-'a'] = nodes.size() - 1;
		nod_act = nodes.size() - 1;
		
	}
	nodes[nod_act].final = true;
}

	


int main() {
	
	freopen("ahocorasick.in", "r", stdin);
	freopen("ahocorasick.out", "w", stdout);
	int nr_cuv;
	scanf("%s\n%d", sir, &nr_cuv);
	
	trie tri;
	for( int i = 0; i < nr_cuv; ++i) {
		char temp_cuv[10001];
		scanf("%s", temp_cuv);
		tri.add (temp_cuv);
	}
	
	
	
	
	
	
	return 0;
}