Cod sursa(job #416995)

Utilizator arnold23Arnold Tempfli arnold23 Data 13 martie 2010 20:09:12
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>

using namespace std;

char s[100];

struct trie
{
  long val,fi;
  trie * kov[26];
  trie()
  {
	val=fi=0;
	memset(kov,0,sizeof kov);
  }
};

trie *g=new trie;

int insert(trie *nod,char *p)
{
  if (strlen(p)==0)
  {
	nod->val++;
  }	else
  {
	int h=*p-'a';
	if (nod->kov[h]==0)
	{
	  nod->kov[h]=new trie;
	  nod->fi++;
	}
	insert(nod->kov[h],++p);
  }

  return 0;

}

int dele(trie *nod,char *p)
{
  if (strlen(p)==0)
	nod->val--;
	else
  {
	int h=*p-'a';
	if (dele(nod->kov[h],++p)==1)
	{
	   nod->kov[h]=0;
	   nod->fi--;
	}
  }
  if (nod->val==0 && nod->fi==0 && nod!=g)
  {
	delete nod;
	return 1;
  }

  return 0;
}

long query(trie *nod,char *p)
{
  if (strlen(p)==0) return nod->val; else
  {
   int h=*p-'a';
   if (nod->fi!=0) return query(nod->kov[h],++p);
  }
  return 0;
}

long pre(trie *nod,char *p,long ho)
{
  int h=*p-'a';
  if (strlen(p)==0 || nod->kov[h]==0) return ho; else
  return pre(nod->kov[h],++p,++ho);

  return 0;
}

int main()
{
  ifstream in("trie.in");
  ofstream out("trie.out");

  //long num=0;
  while (in.good())
  {
	in.getline(s,100);
	//out << s << "\n";
	//++num;
	if (s[0]=='0') insert(g,s+2); else
	if (s[0]=='1') dele(g,s+2); else
	if (s[0]=='2') out << query(g,s+2) << "\n"; else
	if (s[0]=='3') out << pre(g,s+2,0) << "\n";
  }
  //out << "\n" << num;

  in.close();
  out.close();

  return 0;
}