Cod sursa(job #544501)

Utilizator klamathixMihai Calancea klamathix Data 1 martie 2011 18:25:25
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<cstdio>
#include<cstring>
#include<string>
const int maxl = 45;
using namespace std;

char sir[maxl];

struct Trie {
	int cnt , nrfii;
	Trie *fiu[26];

	Trie () {
		cnt = nrfii = 0;
		memset( fiu , 0 , sizeof(fiu));
	}
};

Trie *T = new Trie;

void insert ( Trie *nod , char *s ) {
	
	if( *s == '\n' ) {
		nod -> cnt ++;
		return;
	}
	
	if (nod -> fiu[*s - 'a'] == 0 ) {
		nod -> fiu[*s - 'a'] = new Trie;
		nod -> nrfii++;
	}
	
	insert(nod -> fiu[*s - 'a'] , s + 1);
}

int del (Trie *nod , char *s ) {
	
	if( *s == '\n' ) 
		nod -> cnt--;
	else if ( del( nod -> fiu[*s - 'a'] , s + 1) ) {
			nod -> fiu[*s - 'a'] = 0 ;
			nod -> nrfii--;
	}
		
	if( nod->cnt == 0 && nod->nrfii == 0 && nod!= T ) { 
		delete nod;
		return 1;
	}
	
	return 0;
}
	
	
int count (Trie *nod , char *s) {
		if (*s == '\n')
			return nod -> cnt;
		
	if ( nod -> fiu[*s - 'a'] )
		return count(nod -> fiu[*s - 'a'], s + 1);
	return 0;
}

int pre (Trie *nod , char *s , int depth) {
	
	if(*s == '\n' || nod -> fiu[*s - 'a'] == 0)
		return depth;
	return pre(nod  -> fiu[*s - 'a'], s + 1, depth + 1);
}	

int main()
{
	freopen ("trie.in","r",stdin);
	freopen ("trie.out","w",stdout);
	
	for ( ; ! feof(stdin) ; ) {
		fgets( sir , 40 , stdin);
		if(feof(stdin)) continue;
		if( sir[0] == '0')
			insert(T, sir + 2);
		if( sir[0] == '1')
			del(T, sir + 2);
		if( sir[0] == '2')
			printf("%d\n",count(T, sir + 2));
		if( sir[0] == '3' )
			printf("%d\n",pre(T ,sir + 2 , 0));
	}
	
	return 0;
}