Pagini recente » Cod sursa (job #396623) | Cod sursa (job #77905) | Cod sursa (job #1256097) | Cod sursa (job #645116) | Cod sursa (job #428222)
Cod sursa(job #428222)
#include <cstdio>
#include <string.h>
#define Lmax 22
struct Trie {
int nr_cuv, nr_fii;
Trie *fiu[26];
Trie () {
nr_cuv = 0, nr_fii = 0;
memset (fiu, 0, sizeof (fiu));
}
} *R;
int tip;
char cuv[Lmax];
void add_trie (Trie *rad, char *cuv) {
if (*cuv == '\n') {
rad->nr_cuv++;
return ;
}
if (!rad->fiu[*cuv - 'a']) {
rad->fiu[*cuv - 'a'] = new Trie;
rad->nr_fii++;
}
add_trie (rad->fiu[*cuv - 'a'], cuv + 1);
}
int delete_trie (Trie *rad, char *cuv) {
if (*cuv == '\n') {
rad->nr_cuv--;
if (rad != R && rad->nr_fii == 0 && rad->nr_cuv == 0) {
delete rad;
return 1;
}
return 0;
}
if (delete_trie ( rad->fiu[*cuv - 'a'], cuv + 1 )) {
rad->nr_fii--;
rad->fiu[*cuv - 'a'] = 0;
if (rad != R && rad->nr_fii == 0 && rad->nr_cuv == 0) {
delete rad;
return 1;
}
}
return 0;
}
int nr_query (Trie *rad, char *cuv) {
if (*cuv == '\n')
return rad->nr_cuv;
if (!rad->fiu[*cuv - 'a']) return 0;
else return nr_query (rad->fiu[*cuv - 'a'], cuv + 1);
}
int prefix_query (Trie *rad, char *cuv, int lg) {
if (*cuv == '\n')
return lg;
if (!rad->fiu[*cuv - 'a']) return lg;
return prefix_query (rad->fiu[*cuv - 'a'], cuv + 1, lg + 1);
}
int main () {
FILE *f = fopen ("trie.in", "r");
freopen ("trie.out", "w", stdout);
cuv[0] = ' '; fscanf (f, "%d %s", &tip, cuv + 1);
R = new Trie;
while (!feof (f)) {
cuv[ strlen(cuv) ] = '\n';
switch (tip) {
case 0 : add_trie (R, cuv + 1); break;
case 1 : delete_trie (R, cuv + 1); break;
case 2 : printf ("%d\n", nr_query (R, cuv + 1)); break;
case 3 : printf ("%d\n", prefix_query (R, cuv + 1, 0)); break;
}
fscanf (f, "%d %s", &tip, cuv + 1);
}
fclose (f);
return 0;
}