Pagini recente » Cod sursa (job #722527) | Cod sursa (job #2167680) | Cod sursa (job #1485997) | Cod sursa (job #426142) | Cod sursa (job #1371026)
#include <iostream>
#include<cstring>
#include<fstream>
#include<string>
using namespace std;
#define CH (*s - 'a')
char cuvant[100000];
int tip;
struct Trie {
int cnt;
int nrfii;
Trie* fiu[26];
Trie()
{
cnt=0;
nrfii=0;
memset (fiu,0,sizeof(fiu));
}
};
Trie* T= new Trie;
void ins(Trie *T, char *s)
{
if(*s=='\0') {T->cnt++; return;}
if(T->fiu[*s-'a']==0)
{
T->fiu[*s-'a']=new Trie;
T->nrfii++;
}
ins(T->fiu[*s-'a'],s+1);
}
int del(Trie *nod,char *s)
{
if(*s=='\0')
nod->cnt--;
else if(del(nod->fiu[*s-'a'],s+1))
{
nod->fiu[*s-'a']=0;
nod->nrfii--;
}
if(nod->cnt==0 && nod->nrfii==0 && nod!=T)
{
delete nod;
return 1;
}
return 0;
}
int doi(Trie* T,char *s)
{
if(*s=='\0') return T->cnt;
if( T->fiu[*s-'a'] )
return doi( T->fiu[*s-'a' ], s+1 );
return 0;
}
int trei(Trie* nod, char *s, int k)
{
if( *s == '\n' || nod->fiu[*s-'a' ] == 0 )
return k;
return trei( nod->fiu[*s-'a'], 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': ins( T, line+2 ); break;
case '1': del( T, line+2 ); break;
case '2': printf( "%d\n", doi( T, line+2 ) ); break;
case '3': printf( "%d\n", trei( T, line+2, 0 ) ); break;
}
fgets( line, 32, stdin );
}
return 0;
}