Cod sursa(job #743102)

Utilizator caramete_tCaramete Tiberiu caramete_t Data 3 mai 2012 10:13:18
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <stdio.h>
#include <string.h>

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

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 del(ntrie *nod, char *sir) 
{if(*sir=='\n')
		nod->nr--;	
else 
if(del(nod->nexts[*sir - 'a'], sir+1)) 
 {nod->nexts[*sir-'a'] = 0;
	nod->nrfii--;}
   if(nod->nr == 0 && nod->nrfii == 0 && nod != X) 
	{delete nod; 
	return 1;}
return 0;}

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

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

int main()
{freopen("trie.in", "r", stdin);
 freopen("trie.out", "w",stdout);
	fgets(cuv,100,stdin);	
	do {if (cuv[0] == '0')
			put(X,cuv+2);		
		if (cuv[0] == '1')
			del(X,cuv+2);
		if (cuv[0] == '2')
			printf("%d\n", number(X,cuv+2));
		if (cuv[0] == '3')
			printf("%d\n", pref(X,cuv+2,0));
		fgets(cuv,100,stdin);	
	} while (!feof(stdin));
	return 0;}