Pagini recente » Cod sursa (job #1463800) | Cod sursa (job #2244331) | Cod sursa (job #1151520) | Cod sursa (job #1034303) | Cod sursa (job #1444153)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
int aparitii, fii;
Trie *urm[26],*tata;
Trie()
{
aparitii = fii = 0;
memset( urm , 0 , sizeof( urm ) );
tata = 0;
}
};
Trie *Tr = new Trie;
int op;
char s[30];
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;
}
sterge( T -> urm[ *s - 'a' ] , s + 1 );
if( T -> fii == 0 && T -> aparitii == 0 )
{
T -> tata -> fii --;
T -> tata -> urm[ *( s - 1 ) - 'a' ] = 0;
delete T;
}
}
int aparitie( Trie *T , char *s )
{
if( *s == NULL )
{
return T -> aparitii;
}
if( T -> urm[ *s - 'a' ] != 0 )
aparitie( T -> urm[ *s - 'a' ] , s + 1 );
else
return 0;
}
int prefix( Trie *T , char *s )
{
if( *s == NULL || T -> urm[ *s - 'a' ] == 0 )
return 0;
return prefix( T -> urm[ *s - 'a' ] , s + 1 ) + 1;
}
int main()
{
while( fin>>op )
{
fin.get( s , 25 );
if( op == 0 )
{
adauga( Tr , s + 1 );
}
else if( op == 1 )
{
sterge( Tr , s + 1 );
}
else if( op == 2 )
{
fout<<aparitie( Tr , s + 1 )<<'\n';
}
else
{
fout<<prefix( Tr , s + 1 )<<'\n';
}
}
}