Pagini recente » Cod sursa (job #1102654) | Cod sursa (job #2470742) | Cod sursa (job #264026) | Cod sursa (job #412770) | Cod sursa (job #538559)
Cod sursa(job #538559)
#include <cstdio>
#include <cstring>
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 = new trie;
void adauga (trie*, char*);
int sterge (trie*, char*), query (trie*, char*), prefix (trie*, char*, int);
int main () {
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
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", query (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 (!nod -> fii[*p - 'a']) {
nod -> fii[*p - 'a'] = new trie;
nod -> nr_fii++;
}
adauga (nod -> fii[*p - 'a'], p + 1);
}
int 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 (!nod -> fii[*p - 'a'])
return 0;
if (sterge (nod -> fii[*p - 'a'], p + 1)) {
nod -> nr_fii--;
nod -> fii[*p - 'a'] = 0;
if (nod != R && !nod -> nr_cuv && !nod -> nr_fii) {
delete nod;
return 1;
}
else
return 0;
}
return 0;
}
int query (trie *nod, char *p) {
if (*p == '\n')
return nod -> nr_cuv;
if (!nod -> fii[*p - 'a'])
return 0;
return query (nod -> fii[*p - 'a'], p + 1);
}
int prefix (trie *nod, char *p, int lg) {
if (*p == '\n' || !nod -> fii[*p - 'a'])
return lg;
return prefix (nod -> fii[*p - 'a'], p + 1, lg + 1);
}