Cod sursa(job #1514656)

Utilizator adimAlexander Dmitriev adim Data 31 octombrie 2015 13:22:31
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <bits/stdc++.h>
using namespace std;

struct trie {
	int no;
	int childs;
	trie *child[26];
	
	trie() {
		no = childs = 0;
		for (int i=0;i<26;i++)
			child[i] = NULL;
	}
};

ifstream f("trie.in");
ofstream g("trie.out");

string word;
trie *root = new trie();
bool shouldBreak = false;

int findPrefix() {
	int prefix = 0;
	trie *node = root;
	
	for (int i=0;i<word.size();i++) {
		if (node->child[word[i] - 'a'] != NULL) {
			node = node->child[word[i] - 'a'];
			prefix++;
		} else
			return prefix;
	}
	
	return prefix;
}

int queryWord() {
	trie *node = root;
	for (int i=0;i<word.size();i++) {
		if (node->child[word[i] - 'a'] == NULL) {
			return 0;
		}
		
		node = node->child[word[i] - 'a'];
	}
	
	return node->no;
}

void deleteWord(int index, trie* &node) {
	if (shouldBreak)
		return;
	if (index == word.size()) {
		node->no--;
		if (node->no == 0) {
			node = NULL;
		}
		return;
	}
	
	deleteWord(index+1, node->child[word[index] - 'a']);
	if (node->child[word[index] - 'a'] == NULL) {
		node->childs--;
	}
	if (node->childs == 0) {
		node = NULL;
	} else {
		shouldBreak = true;
	}
}

void addWord() {
	trie *node = root;
	for (int i=0;i<word.size();i++) {
		if (node->child[word[i] - 'a'] == NULL) {
			node->child[word[i] - 'a'] = new trie();
			node->childs++;
		}
		
		node = node->child[word[i] - 'a'];
	}
	
	node->no++;
}

void read() {
	int tip;
	
	while (f>>tip) {
		f>>word;
		if (tip == 0) {
			// adauga o aparitie a cuvantului w in lista
			addWord();
		} else if (tip == 1) {
			// sterge o aparitie a cuvantului w din lista
			shouldBreak = false;
			deleteWord(0, root);
		} else if (tip == 2) {
			// tipareste numarul de aparitii ale cuvantului w in lista
			g<<queryWord()<<'\n';
		} else if (tip == 3) {
			// tipareste lungimea celui mai lung prefix comun al lui w cu oricare cuvant din lista
			g<<findPrefix()<<'\n';
		}
	}
}

int main() {

	read();
	
	f.close(); g.close();
	return 0;
}