Cod sursa(job #415945)

Utilizator arnold23Arnold Tempfli arnold23 Data 11 martie 2010 23:33:07
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 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 (*p=='\n')
  {
	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 (*p=='\n')
	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 (*p=='\n' ) 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 (*p=='\n' || 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");

  while (in.good())
  {
	in >> s;
	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
	out << pre(g,s+2,0) << "\n";
  }

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

  return 0;
}