Pagini recente » Cod sursa (job #1585967) | Cod sursa (job #2771131) | Cod sursa (job #2415533) | Cod sursa (job #2603886) | Cod sursa (job #1457640)
#include <fstream>
#include <string>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
int fii,aparitii;
Trie *urm[26] , *tata;
Trie()
{
fii = aparitii = 0;
memset( urm , 0 , sizeof( urm ) );
tata = 0;
}
};
char cuvant[30];
int operatie,i,j,n,m;
Trie *Tr;
void adauga( Trie *T, char *s )
{
if( *s == NULL )
{
T -> aparitii ++;
return;
}
if( T -> urm[ *s - 'a' ] == 0 )
{
T -> urm[ *s - 'a' ] = new Trie;
T -> urm[ *s - 'a' ] -> tata = T;
T -> fii ++;
}
adauga( T -> urm[ *s - 'a' ] , s + 1 );
}
void sterge( Trie *T , char *s )
{
if( *s == NULL )
{
T -> aparitii --;
if( T -> fii == 0 && T -> aparitii == 0 )
{
T -> tata -> fii --;
T -> tata -> urm[ *( s - 1 ) - 'a' ] = 0;
delete T;
}
return;
}
else
{
sterge( T -> urm[ *s - 'a' ] , s + 1 );
if( T -> fii == 0 && T -> aparitii == 0 && T != Tr )
{
T -> tata -> fii --;
T -> tata -> urm[ *( s - 1 ) - 'a' ] = 0;
delete T;
}
return;
}
}
int aparitie( Trie *T , char *s )
{
if( *s == NULL )
return ( T -> aparitii );
else
{
if( T -> urm[ *s - 'a' ] )
return aparitie( T -> urm[ *s - 'a' ] , s + 1 );
else
return 0;
}
}
int prefix( Trie *T , char *s )
{
if( *s == NULL )
{
return 0;
}
else
{
if( T -> urm[ *s - 'a'] )
return prefix( T -> urm[ *s - 'a' ] , s + 1 ) + 1 ;
else
return 0;
}
}
int main()
{
Tr = new Trie;
while( fin>>operatie )
{
fin.get( cuvant , 25 );
if( operatie == 0 ) /// Adaugare
{
adauga( Tr , cuvant + 1 );
}
else if( operatie == 1 ) /// Stergere
{
sterge( Tr , cuvant + 1 );
}
else if( operatie == 2 ) /// Aparitii
{
fout<<aparitie( Tr , cuvant + 1 )<<'\n';
}
else if( operatie == 3 ) /// Prefix
{
fout<<prefix( Tr , cuvant + 1 )<<'\n';
}
}
return 0;
}