Pagini recente » Cod sursa (job #2780591) | Cod sursa (job #2558761) | Cod sursa (job #763878) | Cod sursa (job #1118012) | Cod sursa (job #615139)
Cod sursa(job #615139)
#include <cstdio>
#include <cstring>
#define LMAX 25
using namespace std;
struct nod
{
nod *L[26];
int CateCuv, CatiFii;
nod()
{
memset( L, 0, sizeof(L) );
CateCuv = CatiFii = 0;
}
};
nod *R;
int Tip, LC;
char Cuv[LMAX];
inline void Adauga( nod *NOD, char *lit )
{
if( *lit == 0 )
{
++(NOD -> CateCuv);
return;
}
if( NOD -> L[*lit - 'a'] == NULL )
{
NOD -> L[*lit - 'a'] = new nod;
++(NOD -> CatiFii);
}
Adauga( NOD -> L[*lit - 'a'], lit+1 );
}
inline int Scoate( nod *NOD, char *lit )
{
if( *lit == 0 ) --(NOD -> CateCuv);
else if( Scoate( NOD -> L[*lit - 'a'], lit+1 ) )
{
NOD -> L[*lit - 'a'] = NULL;
--(NOD -> CatiFii);
}
if( !(NOD -> CateCuv) && !(NOD -> CatiFii) && NOD != R )
{
delete NOD;
return 1;
}
return 0;
}
inline int NrAparitii( nod *NOD, char *lit )
{
if( *lit == 0 ) return NOD -> CateCuv;
if( NOD -> L[*lit - 'a'] ) return NrAparitii( NOD -> L[*lit - 'a'], lit+1 );
return 0;
}
inline int LGLCP( nod *NOD, char *lit, int Lg )
{
if( *lit == 0 || NOD -> L[*lit - 'a'] == NULL ) return Lg;
return LGLCP( NOD -> L[*lit - 'a'], lit+1, Lg+1 );
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
nod *R = new nod;
do
{
memset( Cuv, 0, sizeof(Cuv) );
scanf("%d %s\n", &Tip, Cuv);
switch( Tip )
{
case 0:
Adauga( R, Cuv );
break;
case 1:
Scoate( R, Cuv );
break;
case 2:
printf("%d\n", NrAparitii( R, Cuv ));
break;
case 3:
printf("%d\n", LGLCP( R, Cuv, 0 ));
break;
}
}
while( !feof(stdin) );
return 0;
}