Pagini recente » Cod sursa (job #2641445) | Cod sursa (job #608025) | Cod sursa (job #2535460) | Cod sursa (job #1077209) | Cod sursa (job #326342)
Cod sursa(job #326342)
using namespace std;
#include <cstdio>
#include <string>
struct trie {
int nrcuv, nrfii;
trie *fiu[26];
trie() {
nrcuv = nrfii = 0;
memset(fiu, 0, sizeof(fiu));
}
};
int tip, n;
char cuv[32];
void insert( trie *nod, int i ){
if( i > n ){ nod->nrcuv++; return ;}
if( nod->fiu[ cuv[i] - 'a' ] == 0 ){
nod->fiu[ cuv[i] - 'a' ] = new trie;
nod->nrfii++;
}
insert( nod->fiu[ cuv[i] - 'a' ], i + 1 );
}
int del( trie *nod, int i ){
if( i > n ) {
nod->nrcuv--;
if( nod->nrcuv == 0 && nod->nrfii == 0){delete nod ; return 1;}
return 0;
}
if( del( nod->fiu[ cuv[i] - 'a' ], i + 1 ) ){
nod->fiu[ cuv[i] - 'a' ] = 0;
nod->nrfii--;
}
if( nod->nrcuv == 0 && nod->nrfii == 0){delete nod ; return 1;}
return 0;
}
int query( trie *nod, int i ){
if( i > n ){ return nod->nrcuv;}
if( nod->fiu[ cuv[i] - 'a' ] ) return query(nod->fiu[ cuv[i] - 'a' ], i + 1);
return 0;
}
int prefix( trie *nod, int i, int lg ){
if( i > n || nod->fiu[ cuv[i] - 'a' ] == 0) return lg;
return prefix( nod->fiu[ cuv[i] - 'a' ], i + 1, lg + 1 );
}
int main(){
FILE *f = fopen("trie.in", "r");
FILE *g = fopen("trie.out", "w");
trie *R = new trie;
fscanf(f,"%d %s", &tip, cuv);
while( !feof(f) ){
n = strlen(cuv) - 1;
if( R == 0 ) R = new trie;
switch (tip){
case 0 : insert(R, 0); break;
case 1 : del(R, 0); break;
case 2 : fprintf(g,"%d\n", query(R, 0)); break;
case 3 : fprintf(g,"%d\n", prefix(R, 0, 0)); break;
}
fscanf(f,"%d %s", &tip, cuv);
}
fclose(f);
fclose(g);
return 0;
}