Cod sursa(job #263485)

Utilizator tvladTataranu Vlad tvlad Data 20 februarie 2009 14:33:01
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
#include <string>
#include <vector>
using namespace std;

const int SIGMA = 26;

ifstream fin("trie.in");
ofstream fout("trie.out");

class trie {
	struct trie_node {
		int w, end;
		trie_node* next[SIGMA];
		trie_node() {
			w = 0;
			end = 0;
			for (int i = 0; i < SIGMA; ++i) next[i] = NULL;
		}
		trie_node*& operator[] ( char x ) { return next[x-'a']; }
	};
	trie_node root;
public:
	trie() {}
	~trie() {}
	void insert ( string s ) {
		trie_node *cur = &root;
		++cur->w;
		for (int i = 0; i < s.size(); ++i) {
			if ((*cur)[s[i]] == NULL) (*cur)[s[i]] = new trie_node;
			cur = (*cur)[s[i]];
			++cur->w;
		}
		++cur->end;
	}
	void remove ( string s ) {
		trie_node *cur = &root, *prev;
		vector<trie_node*> del;
		--cur->w;
		for (int i = 0; i < s.size(); ++i) {
			prev = cur;
			cur = (*cur)[s[i]];
			--cur->w;
			if (cur->w == 0) {
				(*prev)[s[i]] = NULL;
				del.push_back(cur);
				for (++i; i < s.size(); ++i) {
					cur = (*cur)[s[i]];
					del.push_back(cur);
				}
			}
		}
		for (int i = 0; i < del.size(); ++i)
			delete del[i];
	}
	trie_node* find ( string s ) {
		trie_node *cur = &root;
		for (int i = 0; i < s.size(); ++i) {
			if ((*cur)[s[i]] == NULL)
				return &root;
			cur = (*cur)[s[i]];
		}
		return cur;
	}
	int lcp ( string s ) {
		trie_node *cur = &root;
		for (int i = 0; i < s.size(); ++i) {
			if ((*cur)[s[i]] == NULL)
				return i;
			cur = (*cur)[s[i]];
		}
		return s.size();
	}
};

trie T;
int cod, ncod;
string cuv;

int main() {
	fin >> ncod;
	while (!fin.eof()) {
		cod = ncod;
		fin >> cuv >> ncod;
		if (cod == 0) T.insert(cuv); else
		if (cod == 1) T.remove(cuv); else
		if (cod == 2) fout << T.find(cuv)->end << '\n'; else
		if (cod == 3) fout << T.lcp(cuv) << '\n';
	}
}