Pagini recente » Cod sursa (job #1985470) | Cod sursa (job #960678) | Cod sursa (job #1072818) | Cod sursa (job #1433841) | Cod sursa (job #1255923)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("trie.in");
ofstream g ("trie.out");
const int LMAX = 26;
char s[LMAX];
struct trie {
int aparitii, nrcuv;
trie *fii[LMAX];
trie() {
aparitii = 0;
nrcuv = 0;
for (int i = 0; i < LMAX; i++) fii[i] = NULL;
};
};
trie *radacina;
trie *adauga(trie *p, char *s) {
if (p == NULL) p = new trie;
p->aparitii++;
if (s[0] == 0) p->nrcuv++;
else p->fii[s[0] - 'a'] = adauga(p->fii[s[0] - 'a'], s + 1);
return p;
}
trie *sterge(trie *p, char *s) {
p->aparitii--;
if(s[0] == 0) p->nrcuv--;
else p->fii[s[0] - 'a'] = sterge(p->fii[s[0] - 'a'], s + 1);
if(p->aparitii == 0) {
delete(p);
return NULL;
}
return p;
}
int aparitii(trie *p, char *s) {
if (p == NULL) return 0;
if (s[0] == 0) return p->nrcuv;
return aparitii(p->fii[s[0] - 'a'], s + 1);
}
int prefix(trie *p, char *s) {
if (p == NULL) return -1;
if (s[0] == 0) return 0;
return 1 + prefix(p->fii[s[0] - 'a'], s + 1);
}
void rezolva() {
int t;
radacina = new trie;
while (f >> t) {
f >> s;
if (t == 0) radacina = adauga(radacina, s);
else if (t == 1) radacina = sterge(radacina, s);
else if (t == 2) g << aparitii(radacina, s) << '\n';
else g << prefix(radacina, s) << '\n';
}
}
int main() {
rezolva();
return 0;
}