Cod sursa(job #1439694)

Utilizator sorin2kSorin Nutu sorin2k Data 22 mai 2015 23:41:19
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include<fstream>
#include<string>
using namespace std;

struct Node {
	int final;
	int intermediar;
	Node* children[26];
};

Node* trie[26];

Node *new_node() {
	Node *p = new Node();
	p->intermediar = 0;
	p->final = 0;
	for (int i = 0; i < 26; i++) {
		p->children[i] = 0;
	}
	return p;
}

void adauga(string x) {
	if (trie[x[0] - 'a'] == 0) {
		trie[x[0] - 'a'] = new_node();
	}
	Node *nod = trie[x[0] - 'a'];
	if (x.size() == 1) {
		nod->final++;
	} else {
		nod->intermediar++;
		for (int i = 1; i < x.size() - 1; i++) {
			if (nod->children[x[i] - 'a'] == 0) {
				nod->children[x[i] - 'a'] = new_node();
			}
			nod = nod->children[x[i] - 'a'];
			nod->intermediar++;
		}
		if (nod->children[x[x.size() - 1] - 'a'] == 0) {
			nod->children[x[x.size() - 1] - 'a'] = new_node();
		}
		nod = nod->children[x[x.size() - 1] - 'a'];
		nod->final++;
	}
}

void sterge(string x) {
	Node *nod = trie[x[0] - 'a'];
	if (x.size() == 1) {
		nod->final--;
	} else {
		nod->intermediar--;
		for (int i = 1; i < x.size() - 1; i++) {
			nod = nod->children[x[i] - 'a'];
			nod->intermediar--;
		}
		nod = nod->children[x[x.size() - 1] - 'a'];
		nod->final--;
	}
}

int nr_aparitii(string x) {
	if (trie[x[0] - 'a'] == 0) return 0;
	Node *nod = trie[x[0] - 'a'];
	for (int i = 1; i < x.size(); i++) {
		nod = nod->children[x[i] - 'a'];
		if (nod == 0) return 0;
	}
	return nod->final;
}

int prefix(string x) {
	if (trie[x[0] - 'a'] == 0 || (trie[x[0] - 'a']->final == 0 && trie[x[0] - 'a']->intermediar == 0)) return 0;
	int i = 0;
	Node *nod = trie[x[0] - 'a'];
	for (i = 1; i < x.size(); i++) {
		nod = nod->children[x[i] - 'a'];
		if (nod == 0 || (nod->final == 0 && nod->intermediar == 0)) break;
	}
	return i;
}

int main() {
	ifstream fin("trie.in");
	ofstream fout("trie.out");
	int x;
	string s;
	while (fin >> x) {
		fin >> s;
		if (x == 0) adauga(s);
		if (x == 1) sterge(s);
		if (x == 2) fout << nr_aparitii(s) << "\n";
		if (x == 3) fout << prefix(s) << "\n";
	}
	return 0;
}