Pagini recente » Cod sursa (job #775903) | Cod sursa (job #414457) | Cod sursa (job #2547756) | Cod sursa (job #495452) | Cod sursa (job #455442)
Cod sursa(job #455442)
#include <cstdio>
#include <string>
#define Lmax 22
struct Trie {
int nr_cuv, nr_fii;
Trie *fii[26];
Trie () {
this->nr_cuv = 0;
this->nr_fii = 0;
memset (this->fii, 0, sizeof (this->fii));
}
} *R;
char cuv[Lmax];
void add (Trie* nod, char *cuv) {
if (*cuv == '\n') {
nod->nr_cuv++;
return ;
}
if (!nod->fii[(*cuv) - 'a']) {
nod->fii[(*cuv) - 'a'] = new Trie ();
nod->nr_fii++;
}
add (nod->fii[(*cuv) - 'a'], cuv + 1);
}
int erase (Trie* nod, char *cuv) {
if (*cuv == '\n') {
nod->nr_cuv--;
if (R != nod && nod->nr_fii == 0 && nod->nr_cuv == 0) {
delete nod;
return 1;
}
return 0;
}
if (nod->fii[(*cuv) - 'a'] == 0)
return 0;
if (erase (nod->fii[(*cuv) - 'a'], cuv + 1)) {
nod->fii[(*cuv) - 'a'] = 0;
nod->nr_fii--;
if (R != nod && nod->nr_fii == 0 && nod->nr_cuv == 0) {
delete nod;
return 1;
}
}
return 0;
}
int numara (Trie* &nod, char *cuv) {
if (*cuv == '\n')
return nod->nr_cuv;
if (nod->fii[(*cuv) - 'a'] == 0)
return 0;
return numara (nod->fii[(*cuv) - 'a'], cuv + 1);
}
int prefix (Trie* &nod, char *cuv, int l) {
if (nod->fii[(*cuv) - 'a'] == 0 || *cuv == '\n')
return l;
return prefix (nod->fii[(*cuv) - 'a'], cuv + 1, l + 1);
}
int main () {
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
int tip;
R = new Trie ();
scanf ("%d %s", &tip, cuv);
cuv[strlen(cuv)] = '\n';
while (!feof (stdin)) {
if (tip == 0)
add (R, cuv);
if (tip == 1)
erase (R, cuv);
if (tip == 2)
printf ("%d\n", numara (R, cuv));
if (tip == 3)
printf ("%d\n", prefix (R, cuv, 0));
scanf ("%d %s", &tip, cuv);
cuv[strlen(cuv)] = '\n';
}
return 0;
}