Pagini recente » Cod sursa (job #1085549) | Cod sursa (job #1622594) | Cod sursa (job #425942) | Cod sursa (job #1555497) | Cod sursa (job #1977734)
#include <cstdio>
#include <cstring>
#define MAXALF 26
#define MAXLEN 25
struct trie {
int cnt, nfii;
trie *fii[MAXALF];
trie() {
cnt = nfii = 0;
memset(fii, 0, sizeof(fii));
}
};
trie *t = new trie;
void add(trie *nod, char *s) {
if (*s == '\n') {
++nod->cnt;
return;
}
if (!(nod->fii[*s - 'a'])) {
++nod->nfii;
nod->fii[*s - 'a'] = new trie;
}
add(nod->fii[*s - 'a'], s + 1);
}
int del(trie *nod, char *s) {
if (*s == '\n') {
--nod->cnt;
} else if (del(nod->fii[*s - 'a'], s + 1)) {
nod->fii[*s - 'a'] = 0;
--nod->nfii;
}
if (!(nod->nfii) && !(nod->cnt) && (nod != t)) {
delete nod;
return 1;
}
return 0;
}
int nrap(trie *nod, char *s) {
if (*s == '\n') {
return nod->cnt;
}
if (nod->fii[*s - 'a']) {
return nrap(nod->fii[*s - 'a'], s + 1);
}
return 0;
}
int pref(trie *nod, char *s, int l = 0) {
if (*s == '\n') {
return l;
}
if (nod->fii[*s - 'a']) {
return pref(nod->fii[*s - 'a'], s + 1, l + 1);
}
return l;
}
int main() {
FILE *fin, *fout;
char q[MAXLEN];
fin = fopen("trie.in", "r");
fgets(q, MAXLEN, fin);
fout = fopen("trie.out", "w");
while (!(feof(fin))) {
switch (q[0]) {
case '0': add(t, q + 2); break;
case '1': del(t, q + 2); break;
case '2': fprintf(fout, "%d\n", nrap(t, q + 2)); break;
case '3': fprintf(fout, "%d\n", pref(t, q + 2)); break;
}
fgets(q, MAXLEN, fin);
}
fclose(fin);
fclose(fout);
return 0;
}