Pagini recente » Cod sursa (job #2063107) | Cod sursa (job #1310675) | Cod sursa (job #67171) | Cod sursa (job #1545729) | Cod sursa (job #575721)
Cod sursa(job #575721)
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <algorithm>
using namespace std;
#define Lmax 22
struct Trie {
int nrfii, nrcuv;
Trie *fii[26];
Trie () {
nrfii = nrcuv = 0;
memset (fii, NULL, sizeof (fii));
}
} *R;
char cuv[Lmax];
void adauga (Trie *nod, char *cuv) {
if (*cuv == '\n') {
nod->nrcuv++;
return ;
}
if (nod->fii[*cuv - 'a'] == NULL) {
nod->nrfii++;
nod->fii[*cuv - 'a'] = new Trie ();
}
adauga (nod->fii[*cuv - 'a'], cuv + 1);
}
int sterge (Trie *nod, char *cuv) {
if (*cuv == '\n') {
nod->nrcuv--;
if (nod->nrcuv == 0 && nod->nrfii == 0) {
delete nod;
return 1;
}
return 0;
}
if (nod->fii[*cuv - 'a'] == NULL) return 0;
if (sterge (nod->fii[*cuv - 'a'], cuv + 1)) {
nod->fii[*cuv - 'a'] = NULL;
nod->nrfii--;
if (nod != R && nod->nrfii == 0 && nod->nrcuv == 0) {
delete nod;
return 1;
}
}
return 0;
}
int aparitii (Trie *nod, char *cuv) {
if (*cuv == '\n') {
return nod->nrcuv;
}
if (nod->fii[*cuv - 'a'] == NULL) return 0;
return aparitii (nod->fii[*cuv - 'a'], cuv + 1);
}
int prefix (Trie *nod, char *cuv, int len) {
if (*cuv == '\n')
return len;
if (nod->fii[*cuv - 'a'] == NULL) return len;
return prefix (nod->fii[*cuv - 'a'], cuv + 1, len + 1);
}
int main () {
freopen ("trie.in", "r", stdin);
freopen ("trie.out", "w", stdout);
int tip;
R = new Trie ();
scanf ("%d %s", &tip, cuv);
while (!feof (stdin)) {
cuv[ strlen (cuv) ] = '\n';
if (tip == 0) adauga (R, cuv);
if (tip == 1) sterge (R, cuv);
if (tip == 2) printf ("%d\n", aparitii (R, cuv));
if (tip == 3) printf ("%d\n", prefix (R, cuv, 0));
memset (cuv, 0, sizeof (cuv));
scanf ("%d %s", &tip, cuv);
}
return 0;
}