Pagini recente » Cod sursa (job #875216) | Cod sursa (job #212502) | Cod sursa (job #901188) | Cod sursa (job #226510) | Cod sursa (job #1516278)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("trie.in");
ofstream g ("trie.out");
const int ALPHA = 26;
const int LMAX = 20;
struct Trie {
int aparitii;
int sfarsit_cuvant;
Trie *fiu[ALPHA];
Trie() {
aparitii = 0;
sfarsit_cuvant = 0;
for (int i = 0; i < ALPHA; i++)
fiu[i] = NULL;
}
};
char s[LMAX];
Trie *radacina;
void init() {
radacina = new Trie;
}
Trie *insereaza_cuvant(Trie *nod, char *s) {
if (nod == NULL) nod = new Trie;
nod->aparitii++;
if (s[0] == 0) nod->sfarsit_cuvant++;
else nod->fiu[s[0] - 'a'] = insereaza_cuvant(nod->fiu[s[0] - 'a'], s + 1);
return nod;
}
Trie *sterge_cuvant(Trie *nod, char *s) {
nod->aparitii--;
if (s[0] == 0) nod->sfarsit_cuvant--;
else nod->fiu[s[0] - 'a'] = sterge_cuvant(nod->fiu[s[0] - 'a'], s + 1);
if (nod->aparitii == 0) {
delete(nod);
return NULL;
}
return nod;
}
int numar_aparitii(Trie *nod, char *s) {
if (nod == NULL) return 0;
if (s[0] == 0) return nod->sfarsit_cuvant;
return numar_aparitii(nod->fiu[s[0] - 'a'], s + 1);
}
int prefix_maxim(Trie *nod, char *s) {
if (nod == NULL) return -1;
if (s[0] == 0) return 0;
return 1 + prefix_maxim(nod->fiu[s[0] - 'a'], s + 1);
}
void rezolva() {
int operatie;
while (f >> operatie) {
f >> s;
//cout << s << endl;
if (operatie == 0) radacina = insereaza_cuvant(radacina, s);
else if (operatie == 1) radacina = sterge_cuvant(radacina, s);
else if (operatie == 2) g << numar_aparitii(radacina, s) << '\n';
else g << prefix_maxim(radacina, s) << '\n';
}
}
int main() {
init();
rezolva();
return 0;
}