Cod sursa(job #743098)

Utilizator caramete_tCaramete Tiberiu caramete_t Data 3 mai 2012 09:36:02
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <stdio.h>
#include <string.h>
#include <fstream.h>

struct ntrie
{int nr,nrfii;
	ntrie *nexts[30];
	ntrie()
	{nr=nrfii= 0;
		memset(nexts,0,sizeof(nexts));}
};
ntrie *X = new ntrie;
char cuv[100];

void put(ntrie *nod, char *p)
{	if (*p == '\n')
	{nod->nr++;
		return;}
	if (nod->nexts[*p-'a'] == 0)
	{nod->nexts[*p-'a'] = new ntrie;
	nod->nrfii++;}	
	put(nod->nexts[*p-'a'],p+1);}

int dele(ntrie *nod, char *p) 
{if( *p == '\n' )
		nod->nr--;	
	else if(dele(nod->nexts[*p - 'a'], p+1)) 
	{nod->nexts[*p-'a'] = 0;
		nod->nrfii--;}
	if(nod->nr == 0 && nod->nrfii == 0 && nod != X) 
	{delete nod; 
    return 1;}
	return 0;}

int number(ntrie *nod, char *p)
{if (*p == '\n')
		return nod->nr;
	if (nod->nexts[*p-'a'] != 0)
		return number(nod->nexts[*p-'a'],p+1);
	return 0;}

int pref(ntrie *nod, char *p,int k)
{
	if ((*p == '\n') || (nod->nexts[*p-'a'] == 0))
		return k;
	return pref(nod->nexts[*p-'a'],p+1,k+1);	
}

int main()
{int ch;
	ifstream f("trie.in");
	ofstream g("trie.out");
while (f>>ch)
 {f>>cuv;
      if(ch==0)
   put(X,cuv+2);
  if(ch==1)
   dele(X,cuv+2);
  if(ch==2)
   g<<number(X,cuv+2);
  if(ch==2)
   g<<pref(X,cuv+2,0);    
  }
 f.close();
 g.close(); 
return 0;
}