Cod sursa(job #638599)

Utilizator andra23Laura Draghici andra23 Data 21 noiembrie 2011 00:29:53
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.61 kb
#include<iostream>
#include<fstream>
#include<vector>

using namespace std;

const int SIGMA = 30;

class Node {
	public:
	int freq;
	char letter;
	vector <Node> son; 
	
	Node() {};
	
	Node(int a, char c, vector <Node> s) {
		freq = a;
		letter = c;
		son = s;
	}
};

class Trie {
	Node root;
	
	void addWord(Node &root, int pos, const string &s) {
		char letter = s[pos];
		int position = -1;
		for (int i = 0; i < root.son.size(); i++) {
			if (root.son[i].letter == letter) {
				position = i;
				break;
			}
		}
		if (position == -1) {
			Node aux = Node(0, letter, vector<Node>());
			root.son.push_back(aux);
			position = root.son.size()-1;
		}
		if (pos == s.length()-1) {
			root.son[position].freq++;
		} else {
			addWord(root.son[position], pos+1, s);
		}
	};

	void eraseNode(vector <Node> &v, int pos) {
		int end = v.size()-1;
		v[pos] = v[end];
		v.pop_back();
	};

	void eraseWord(Node &root, int pos, const string &s) {
		int position = -1;
		if (pos == s.size()) {
			root.freq--;
		} else {
			for (int i = 0; i < root.son.size(); i++) {
				if (root.son[i].letter == s[pos]) {
					position = i;
					break;
				}
			}
			eraseWord(root.son[position], pos+1, s);
			if (root.son[position].freq == 0 && root.son[position].son.empty()) {
				eraseNode(root.son, position);
			}
		}
	};

	int findWord(const Node &root, int pos, const string &s) {
		if (pos == s.size()) {
			return root.freq;
		} else {
			int position = -1;
			for (int i = 0; i < root.son.size(); i++) {
				if (root.son[i].letter == s[pos]) {
					position = i;
					break;
				}
			}
			if (position >= 0) {
				int aux = findWord(root.son[position], pos+1, s);
				return aux;
			}
			return 0;
		}
	};

	int findLongestPrefix(const Node &root, int pos, string &s) {
		if (pos == s.size()) {
			return 0;
		}
		int position = -1;
		for (int i = 0; i < root.son.size(); i++) {
			if (root.son[i].letter == s[pos]) {
				position = i;
				break;
			}
		}
		if (position == -1) {
			return 0;
		} else {
			return 1 + findLongestPrefix(root.son[position], pos+1, s);
		}
	};

	public:
	void addWord(string &s) {
		addWord(root, 0, s);
	};
	
	void eraseWord(string &s) {
		eraseWord(root, 0, s);	
	};

	int findWord(string &s) {
		return findWord(root, 0, s);
	};

	int findLongestPrefix(string &s) {
		return findLongestPrefix(root, 0, s);
	};
};

int main() {
	ifstream f("trie.in");
	ofstream g("trie.out");
	
	int t;
	string s;
	Trie trie;
	while (f >> t) {
		f >> s;
		if (t == 0) {
			trie.addWord(s);
		} else if (t == 1) {
			trie.eraseWord(s);
		} else if (t == 2) {
			g << trie.findWord(s) << '\n';
		} else {
			g << trie.findLongestPrefix(s) << '\n';
		}
	}

	return 0;
}