Pagini recente » Cod sursa (job #819210) | Cod sursa (job #3237636) | Cod sursa (job #1243511) | Cod sursa (job #655780) | Cod sursa (job #475274)
Cod sursa(job #475274)
#include <cstdio>
#include <cstring>
struct Trie {
int nr_cuv, nr_fii;
Trie *fiu[26];
Trie () {
nr_cuv = 0, nr_fii = 0;
memset (fiu, 0, sizeof (fiu));
}
};
char line[32];
Trie *R = new Trie;
void add (Trie*, char*);
int del (Trie*, char*);
int query (Trie*, char*);
int prefix (Trie*, char*, int);
int main () {
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
while (!feof (stdin)) {
fgets (line, 32, stdin);
switch (line[0]) {
case '0': add (R, line + 2); break;
case '1': del (R, line + 2); break;
case '2': printf ("%d\n", query (R, line + 2)); break;
case '3': printf ("%d\n", prefix (R, line + 2, 0)); break;
}
}
return 0;
}
void add (Trie *nod, char *s) {
if (*s == '\n') {
nod -> nr_cuv++; return;
}
if (nod -> fiu[*s - 'a'] == 0) {
nod -> fiu[*s - 'a'] = new Trie;
nod -> nr_fii++;
}
add (nod -> fiu[*s - 'a'], s + 1);
}
int del (Trie *nod, char *s) {
if (*s == '\n')
nod -> nr_cuv--;
else if (del (nod -> fiu[*s - 'a'], s + 1)) {
nod -> fiu[*s - 'a'] = 0;
nod -> nr_fii--;
}
if (!nod -> nr_cuv && !nod -> nr_fii && nod != R) {
delete nod;
return 1;
}
return 0;
}
int query (Trie *nod, char *s) {
if (*s == '\n')
return nod -> nr_cuv;
if (!nod -> fiu[*s - 'a'])
return 0;
return query (nod -> fiu[*s - 'a'], s + 1);
}
int prefix (Trie *nod, char *s, int lg) {
if (*s == '\n' || !nod -> fiu[*s - 'a'])
return lg;
return prefix (nod -> fiu[*s - 'a'], s + 1, lg + 1);
}