Pagini recente » Cod sursa (job #71061) | Cod sursa (job #1393877) | Cod sursa (job #2793011) | Cod sursa (job #1139768) | Cod sursa (job #580354)
Cod sursa(job #580354)
#include <cstdio>
#include <cstring>
#define nxt (nod -> fii[*p - 'a'])
struct trie {
int nr_cuv, nr_fii;
trie *fii[26];
trie () {
nr_cuv = nr_fii = 0;
memset (fii, 0, sizeof (fii));
}
};
char V[32];
trie *R;
bool sterge (trie*, char*);
int aparitii (trie*, char*), prefix (trie*, char*, int);
void adauga (trie*, char*);
int main () {
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
R = new trie ();
fgets (V, 32, stdin);
while (!feof (stdin)) {
if (V[0] == '0') adauga (R, V + 2);
if (V[0] == '1') sterge (R, V + 2);
if (V[0] == '2') printf ("%d\n", aparitii (R, V + 2));
if (V[0] == '3') printf ("%d\n", prefix (R, V + 2, 0));
fgets (V, 32, stdin);
}
return 0;
}
void adauga (trie *nod, char *p) {
if (*p == '\n') {
nod -> nr_cuv++; return;
}
if (!nxt) {
nxt = new trie ();
nod -> nr_fii++;
}
adauga (nxt, p + 1);
}
int aparitii (trie *nod, char *p) {
if (*p == '\n') return nod -> nr_cuv;
if (!nxt) return 0;
return aparitii (nxt, p + 1);
}
bool sterge (trie *nod, char *p) {
if (*p == '\n') {
nod -> nr_cuv--;
if (nod != R && !nod -> nr_cuv && !nod -> nr_fii) {
delete nod; return 1;
}
else return 0;
}
if (!nxt) return 0;
if (sterge (nxt, p + 1)) {
nod -> nr_fii--;
nxt = 0;
if (nod != R && !nod -> nr_cuv && !nod -> nr_fii) {
delete nod; return 1;
}
else return 0;
}
return 0;
}
int prefix (trie *nod, char *p, int lg) {
if (*p == '\n' || !nxt) return lg;
return prefix (nxt, p + 1, lg + 1);
}