Pagini recente » Cod sursa (job #2419028) | Cod sursa (job #2340080) | Cod sursa (job #2771120) | Cod sursa (job #328284) | Cod sursa (job #397028)
Cod sursa(job #397028)
#include<cstdio>
#include<cstring>
struct Trie {
int nr_cuv, nr_fii;
Trie* Fiu[27];
Trie(){
nr_cuv = nr_fii = 0;
memset( Fiu, 0, sizeof( Fiu ) );
}
};
Trie* T = new Trie;
void add_word( Trie* nod, char* s){
if( *s == '\n' ) {
nod->nr_cuv++;
return ;
}
if( nod->Fiu[ *s - 'a' ] == 0 ){
nod->Fiu[ *s - 'a' ] = new Trie;
nod->nr_fii++;
}
add_word( nod->Fiu[ *s - 'a' ] , s+1 );
}
int del_word( Trie *nod, char *s ){
if( *s == '\n' ) nod->nr_cuv--;
else if ( del_word ( nod->Fiu[ *s - 'a'] , s+1) ) {
nod->Fiu[ *s - 'a' ] = 0;
nod->nr_fii--;
}
if( nod->nr_fii == 0 && nod->nr_fii ==0 && nod!=T ){
delete nod; return 1;
}
return 0;
}
int Query_word( Trie *nod, char* s){
if( *s == '\n' ) return nod->nr_cuv;
if ( nod->Fiu[ *s - 'a'] ) return Query_word(nod->Fiu[ *s - 'a'],s+1);
return 0;
}
int Prefix( Trie *nod, char *s, int niv){
if( *s == '\n' || nod->Fiu[ *s - 'a'] ==0 ) return niv;
return Prefix( nod->Fiu[ *s - 'a'] , s+1, niv +1);
}
char Line[25];
int main(){
FILE *f=fopen("trie.in","r");
FILE *g=fopen("trie.out","w");
//fgets(Line, 25,f );
while ( !feof(f) ){
fgets(Line, 25,f );
switch ( Line[0] ){
case '0' : add_word ( T, Line + 2 ); break;
case '1' : del_word ( T, Line + 2 ); break;
case '2' : fprintf(g,"%d\n",Query_word(T, Line+2) );break;
case '3' : fprintf(g,"%d\n",Prefix(T, Line+2,0) ); break;
}
}
fclose(f);
fclose(g);
return 0;
}