Pagini recente » Cod sursa (job #2547910) | Cod sursa (job #511695) | Cod sursa (job #2345379) | Borderou de evaluare (job #1731718) | Cod sursa (job #1376905)
#include <fstream>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
const int kLMax = 30;
struct noduri {
int ap, nr;
noduri *fii[kLMax];
noduri() {
ap = 0; nr = 0;
for (int i = 0; i <= kLMax; ++i)
fii[i] = 0;
}
};
noduri *trie=new noduri;
void AdaugareNod(noduri *nod, char *cuvant) {
if (cuvant[0] == 0) {
nod->ap++;
return;
}
if (!nod->fii[cuvant[0] - 'a']) {
nod->fii[cuvant[0] - 'a'] = new noduri;
nod->nr++;
}
AdaugareNod(nod->fii[cuvant[0] - 'a'], cuvant + 1);
}
int StergereNod(noduri *nod, char *cuvant) {
if (cuvant[0] == 0)
nod->ap--;
else if (StergereNod(nod->fii[cuvant[0] - 'a'], cuvant + 1)) {
nod->nr--;
nod->fii[cuvant[0] - 'a'] = 0;
}
if (nod != trie && nod->nr == 0 && nod->ap == 0) {
delete nod;
return 1;
}
return 0;
}
int AparitiiNod(noduri *nod, char *cuvant) {
if (cuvant[0] == 0)
return nod -> ap;
if (nod->fii[cuvant[0] - 'a'] == 0)
return 0;
AparitiiNod(nod->fii[cuvant[0] - 'a'], cuvant + 1);
}
int Cmlpc(noduri *nod, char *cuvant) {
if (cuvant[0] == 0 || nod->fii[cuvant[0] - 'a'] == 0)
return 0;
return (Cmlpc(nod->fii[cuvant[0] - 'a'], cuvant + 1) + 1);
}
int main() {
int tip;
char cuvant[kLMax];
while (in >> tip >> cuvant) {
if (tip == 0)
AdaugareNod(trie, cuvant);
if (tip == 1)
StergereNod(trie, cuvant);
if (tip == 2)
out << AparitiiNod(trie, cuvant) << '\n';
if (tip == 3)
out << Cmlpc(trie, cuvant) << '\n';
}
in.close();
out.close();
return 0;
}