Pagini recente » Cod sursa (job #1332145) | Cod sursa (job #2885392) | Cod sursa (job #2037672) | Cod sursa (job #3130246) | Cod sursa (job #2429768)
#include <iostream>
#include <stdio.h>
#include <cstring>
#define LMAX 20
using namespace std;
char s[LMAX] ;
struct Trie {
Trie* fiu[26] ;
int cnt ;
int nrfii ;
Trie() {
cnt = nrfii = 0 ;
memset(fiu, 0, sizeof(fiu));
}
};
Trie* tri = new Trie ;
void ins (Trie* tr, char *s ) {
if (*s == '\0')
tr->cnt++;
else {
if (tr->fiu[*s-'a'] == 0 ) {
tr->fiu[*s-'a'] = new Trie ;
tr->nrfii++;
}
ins(tr->fiu[s[0]-'a'], s+1 ) ;
}
}
char del (Trie* tr, char *s ) {
if (*s == '\0' )
tr->cnt--;
else {
if ( del(tr->fiu[*s-'a'], s+1) == 1 ) {
tr->nrfii--;
tr->fiu[*s-'a'] = 0 ;
}
}
if (tr->cnt == 0 && tr->nrfii == 0 && tr != tri ) {
delete tr ;
return 1 ;
}
return 0 ;
}
int querry1 (Trie* tr, char *s ) {
if (tr == 0 )
return 0 ;
else {
if (*s == '\0' )
return tr->cnt ;
else
return querry1(tr->fiu[*s-'a'], s+1) ;
}
}
int querry2 (Trie* tr, char *s, int k ) {
if (*s == '\0' || tr->fiu[*s-'a'] == 0 )
return k ;
else
return querry2 (tr->fiu[*s-'a'], s+1, k+1 ) ;
}
void citeste (char *s, FILE* fin ) {
char c ;
c = fgetc(fin) ;
while (c != '\n' ) {
*s = c ;
c = fgetc(fin) ;
s++;
}
*s = '\0' ;
}
int main() {
FILE *fin = fopen ("trie.in", "r" ) ;
FILE *fout = fopen ("trie.out", "w" ) ;
short int op ;
while (fscanf(fin, "%hd", &op ) == 1 ) {
fgetc(fin) ;
citeste(s, fin) ;
switch (op) {
case 0 : {
ins(tri, s) ;
break ;
}
case 1 : {
del(tri, s) ;
break ;
}
case 2 : {
fprintf (fout, "%d\n", querry1(tri, s) ) ;
break ;
}
case 3 : {
fprintf (fout, "%d\n", querry2(tri, s, 0) ) ;
break ;
}
}
}
fclose(fin) ;
fclose(fout) ;
return 0;
}