Pagini recente » Cod sursa (job #1167393) | Cod sursa (job #1167408) | Cod sursa (job #947806) | Cod sursa (job #1212622) | Cod sursa (job #754216)
Cod sursa(job #754216)
/* TRIE - LFA*/
#include <cstdio>
#include <cstring>
#define STR (*s - 'a')
using namespace std;
struct Trie
{
int nrCuv, nrFii; // nr de cuvinte care se termina in nodul curent // nr de cuvinte care au cuvantul pana la nodul curent drept prefix
Trie *fiu[26]; // pt fiecare litera a alfabetului
Trie()
{
nrCuv = nrFii = 0;
memset(fiu, 0, sizeof(fiu));
}
};
Trie *T = new Trie;
void insert(Trie *cuvant, char *s)
{
if(*s == '\n')
{
cuvant->nrCuv ++;
return;
}
if(cuvant->fiu[STR] == 0)
{
cuvant->fiu[STR] = new Trie;
cuvant->nrFii++;
}
insert(cuvant->fiu[STR], s + 1);
}
int del(Trie *cuvant, char *s)
{
if(*s == '\n')
cuvant->nrCuv--;
else if( del(cuvant->fiu[STR], s + 1))
{
cuvant->fiu[STR] = 0;
cuvant->nrFii --;
}
if((cuvant->nrCuv == 0) && (cuvant->nrFii == 0) && (cuvant != T)) // daca nu are cuvinte care se termina in el, nu mai are nici fii si nu e nici radacina
{
delete cuvant;
return 1;
}
return 0;
}
int cuv(Trie *cuvant, char *s)
{
if(*s == '\n') return cuvant->nrCuv;
if(cuvant->fiu[STR])
return cuv(cuvant->fiu[STR], s + 1);
return 0;
}
int pref(Trie *cuvant, char *s, int k)
{
if(*s == '\n' || cuvant->fiu[STR] == 0) return k;
return pref( cuvant->fiu[STR], s+1, k+1 );
}
int main()
{
char line[ 32 ];
freopen( "trie.in", "r", stdin );
freopen( "trie.out", "w", stdout );
fgets( line, 32, stdin );
while( !feof( stdin ) )
{
switch( line[0] )
{
case '0': insert( T, line + 2 ); break;
case '1': del( T, line + 2 ); break;
case '2': printf( "%d\n", cuv( T, line + 2 ) ); break;
case '3': printf( "%d\n", pref( T, line + 2, 0 ) ); break;
}
fgets( line, 32, stdin );
}
return 0;
}