Cod sursa(job #1131038)

Utilizator superman_01Avramescu Cristian superman_01 Data 28 februarie 2014 17:25:05
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>

#define NMAX 27
#define Trans(i) cuv[i] -'a'

using namespace std;

struct Trie
{
	int nr_Sons , nr_W;
	Trie *Son[NMAX];
	Trie()
	{
		memset ( Son , 0 , sizeof( Son ) );
		nr_Sons = nr_W = 0 ;
	}
}*G;

ifstream in ( "trie.in" );
ofstream out ( "trie.out" );

char cuv[NMAX];

void AddWord ( void )
{
	int i , j ;
	Trie *p = G;
	while ( cuv[i] and p->Son[Trans(i)] )
		p = p->Son[Trans(i++)];
	if ( !cuv[i] )
	{
		p->nr_W++;
		return ;
	}
	for( ; cuv[i] ; )
	{
		p->nr_Sons++;
		p->Son[Trans(i)] = new Trie;
		p = p->Son[Trans(i)] ;
		++i;
	}
	p->nr_W++;
}

void PutWord ( void )
{
	int i = 0 ;
	Trie *p= G;
	while ( cuv[i] and p->Son[Trans(i)])
		p = p->Son[Trans(i++)];
	if ( !cuv[i] )
		out << p->nr_W << "\n";
	else out << "0\n";
}

bool ok = false;
void PutPref ( void )
{
	int i=0;
    Trie *p=G;
    while(cuv[i] && p->Son[Trans(i)])
        p=p->Son[Trans(i++)];
    out << i << "\n";
}
void EraseWord ( int i , Trie *p)
{
	if ( cuv[i] )
		EraseWord ( i + 1 , p->Son[Trans(i)] );
	else
	{
		if ( !cuv[i] ) p->nr_W--;
		if ( ok = true )
		{
			p->nr_W--;
			p->nr_Sons = 0 ;
			p->Son[Trans(i)] = 0;
			ok = false;
		}
		
	}
	if ( !p->nr_W and !p->nr_Sons and p!=G )
	{
		delete p ;
		ok = true ;
	}
}

int main ( void )
{
	int i , j , type;
	for ( ; in >> type >> cuv ; )
	{
		if ( type == 0 ) AddWord();
		if ( type == 1 ) EraseWord( 0 , G );
		if ( type == 2 ) PutWord();
		if ( type == 3 ) PutPref();
	}
	in.close();
	out.close();
	return 0 ;
}