Cod sursa(job #1600555)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 15 februarie 2016 09:58:05
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <fstream>
#include <cstring>
using namespace std;

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

#define CH(c)(c - 'a')

class Trie {
 private:
 	static const int ALPHA = 26;

 	Trie *son[ALPHA];
 	int areHere, endsHere;

 public:

 	Trie() {
 		areHere = endsHere = 0;
		memset(son, 0, sizeof(son));
 	}

 	~Trie() {
 		for (int i = 0; i < ALPHA; ++i) {
 			if (son[i] != NULL) {
 				delete son[i];
 			}
 		}
 	}

 	inline void insert(char *s) {
 		Trie *node = this;

 		++node-> areHere;
		for (int i = 0 ; s[i] ; ++ i) {
			int x = s[i] - 'a';

		    if (!node->son[x]) {
		    	node->son[x] = new Trie();
		    }
		      
		    node = node->son[x];
		    ++node->areHere;
		  }
		 
		 ++node->endsHere;
 	}

	inline  void remove(char *s) {
		Trie *node = this;

		--node->areHere;
	    
	    for (int i = 0 ; s[i] ; ++ i) {
	    	int x = s[i] - 'a' ;
	    	if (!node->son[x]) {
	    		return;
	    	}
	        node = node->son[x];
	    	--node->areHere;
	    }
	 
	    --node->endsHere;
	    if (node->endsHere < 0 )
	    	node -> endsHere = 0;
	}
	 
	inline int search(char *s) {
		Trie *node = this;

		for (int i = 0 ; s[i] ; ++ i) {
	  		int x = s[i] - 'a' ;
	    	if (!node->son[x]) {
	    		return 0;
	    	}	 
	    	node =node->son[x];
	  	}
	 
	  	return node->endsHere;
	}
	 
	inline int lcp(char *s) {
		Trie *node = this;
		int i;
	    for (i = 0 ; s[i] ; ++ i) {
	  		int x = s[i] - 'a' ;
	    	if (!node->son[x] ) {
	    		return i;
	    	}
	    	node = node->son[x];
	    	if (!node->areHere) {
	    		return i;
	    	}
	    }
	    return i;
	}
};

int main() {
	Trie *T =  new Trie();

	int op;
	string word;
	int result;

	while (fin >> op) {
		fin >> word;
		char *s = (char * )word.c_str();
		switch(op) {
			case 0:
				T->insert(s);
				break;
			case 1:
				T->remove(s);
				break;
			case 2:
				fout << T->search(s) << '\n';
				break;
			case 3:
				fout << T->lcp(s) << '\n';
				break;
			default:
				break;	
		}
	}

	delete T;

	fin.close();
	fout.close();
	return 0;
}