Cod sursa(job #269176)

Utilizator coderninuHasna Robert coderninu Data 2 martie 2009 17:03:13
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.2 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define Lmax 20


class Nod
{

public : int cnt;
public : Nod ** fii;

public : void Inc()
		  {
			  ++cnt;
		  }

public : void Dec()
		  {
			  --cnt;
		  }

public : Nod()
		 {
			 cnt = 0;
			 fii = (Nod **) calloc(26, sizeof(Nod*));
		 }

public : ~Nod()
		 {
			 delete[] fii;
		 }

public : void AddRel(char c)
		 {
			 if (fii[c - 'a'] == NULL) 
				 fii[c-'a'] = new Nod();
			 fii[c-'a']->Inc();
		 }

public : int Cnt()
		 {
			 return cnt;
		 }

public : Nod * Fiu(char c)
		 {
			return fii[c-'a'];
		 }



};


class Trie
{
private : Nod * root;

public : Trie()
		 {
			root = new Nod();
		 }

public: void Add(char * s)
		{
			Nod * p =root;
			for (int i = 0, L = strlen(s); i<L; ++i)
			{
				p->AddRel(s[i]);
				p = p->Fiu(s[i]);
			}
		}

private : int rm(Nod * p, int loc, int L, char *s)
		  {
			  if (loc < L-1)
				  if (rm(p->Fiu(s[loc+1]),loc+1,L,s))
				  {
					p->fii[s[loc+1]-'a'] = 0;
				  }
			  p->Dec();
			  if (!p->Cnt())
			  {
				free(p);
				p = NULL;
				return 1;
			  }
			  return 0;
		  }

public : void Rem(char *s)
		 {
			 if (rm(root->Fiu(s[0]),0,strlen(s),s))
				root->fii[s[0]] = 0;
		 }

public : int Count(char *s)
		 {
			 int i, L;
			 Nod * p = root;
			 for (i = 0, L = strlen(s); i<L; ++i)
				 if (p->Fiu(s[i]) == NULL) return 0;
				 else p = p->Fiu(s[i]);
			 int rez = p->Cnt();
			 for (i = 0; i <= 'z' - 'a'; ++i)
				 if (p->Fiu(i + 'a') != NULL)
					 rez -= p -> Fiu('a' + i) -> Cnt();
			 return rez;
		 }

public : int Prefix(char *s)
		 {
			 Nod * p = root;
			 for (int i = 0, L = strlen(s); i<L; ++i)
				 if (p->Fiu(s[i]) == NULL ) return i;
				 else p = p->Fiu(s[i]);
			 return strlen(s);
		 }
};

int o;
char S[Lmax];
Trie T;

int main()
{
	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);
	while (!feof(stdin))
	{
		memset(S,0,20);
		scanf("%d %s\n", &o, &S);
		switch(o)
		{
		case 0 : T.Add(S); break;
		case 1 : T.Rem(S); break;
		case 2 : printf("%d\n", T.Count(S)); break;
		case 3 : printf("%d\n", T.Prefix(S)); break;
		}
	}

	return 0;
}