Cod sursa(job #1439693)

Utilizator sorin2kSorin Nutu sorin2k Data 22 mai 2015 23:39:24
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include<iostream>
#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() {
	ios::sync_with_stdio(false);
	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);
	int x;
	string s;
	while (cin >> x) {
		cin >> s;
		if (x == 0) adauga(s);
		if (x == 1) sterge(s);
		if (x == 2) cout << nr_aparitii(s) << "\n";
		if (x == 3) cout << prefix(s) << "\n";
	}
	return 0;
}