Cod sursa(job #674113)

Utilizator andunhillMacarescu Sebastian andunhill Data 5 februarie 2012 16:33:59
Problema Trie Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include<fstream>
using namespace std;

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

class trie
{	
	struct node
	{	int nr_fii;
		int nr_word;
		node *sons[26];
		
		node()
		{	nr_fii = nr_word = 0;
			
			for(int i = 0; i < 26; i++) sons[i] = NULL;
		}
	};
	
	node *root;
	
	public:
		
		trie()
		{	root = new node;
		}
		
		void R_push(char *str, node *p)
		{	if(*str == NULL) 
			{	p->nr_word++;
				return;
			}
			
			if(p->sons[*str - 97] == NULL)
			{	p->sons[*str - 97] = new node;
				p->nr_fii++;
			}
			
			R_push(str + 1, p->sons[*str - 97]);
		}
		
		int R_pop(char *str, node *p)
		{	
			if(*str == NULL)
				p->nr_word--;
			else if(R_pop(str + 1, p->sons[*str - 97]))
			{	p->sons[*str - 97] = NULL;
				p->nr_fii--;
			}
			
			if(p->nr_word == 0 && p->nr_fii == 0 && p != root)
			{	delete p; return 1;
			}
			
			return 0;
		}
		
		void push(char *str)
		{	R_push(str, root);
		}
		
		void pop(char *str)
		{	R_pop(str, root);
		}
		
		int count(char *str)
		{	node *p = root;
			while(*str)
			{	if(p->sons[*str - 97] == NULL) return p->nr_word;
				
				p = p->sons[*str - 97];
				str++;
			}
			return p->nr_word;
		}
		
		int long_com_pref(char *str)
		{	int longest = 0;
			node *p = root;
			
			while(*str)
			{	if(p->sons[*str - 97] == NULL) return longest;
				
				p = p->sons[*str - 97];
				longest++;
				str++;
			}
			return longest;
		}
};

trie A;

int main()
{	int op;
	char word[21];
	
	while(f>>op>>word)
	{	//f>>op>>word;
		
		switch(op)
		{	case 0:	A.push(word); break;
			case 1:	A.pop(word); break;
			case 2:	g<<A.count(word)<<'\n'; break;
			case 3:	g<<A.long_com_pref(word)<<'\n'; break;
		}
	}
	
	f.close();
	g.close();
	return 0;
}