Pagini recente » Cod sursa (job #1376256) | Cod sursa (job #1829717) | Cod sursa (job #3151850) | Cod sursa (job #154107) | Cod sursa (job #1615586)
#include <fstream>
#include <cstring>
#define ic (c[i] - 'a')
using namespace std;
struct Trie {
int ap, nrfii;
Trie* fiu[26];
Trie () { // constructor
ap = nrfii = 0;
memset (fiu, 0, sizeof (fiu));
}
};
ifstream fin("trie.in");
ofstream fout("trie.out");
int op, dim;
string c;
Trie* T = new Trie;
void adauga (Trie* nod, int i) {
if (i == dim) { // Am prelucrat tot cuvantul.
nod->ap++;
return;
}
if (nod->fiu[ic] == NULL) { // Acest fiu este neinitializat.
nod->fiu[ic] = new Trie;
nod->nrfii++;
}
adauga (nod->fiu[ic], i + 1); // Continuam cu trie care are ca radacina acest fiu.
}
bool sterge (Trie* nod, int i) {
if (i == dim)
nod->ap--;
else
if (sterge(nod->fiu[ic], i + 1)) {
nod->fiu[ic] = 0; nod->nrfii--;
}
if (nod->ap == 0 and nod->nrfii == 0 and nod != T) {
delete nod;
return true;
}
return false;
}
int aparitii (Trie *nod, int i) {
if (i == dim)
return nod->ap;
if (nod->fiu[ic])
return aparitii(nod->fiu[ic], i + 1);
return 0;
}
int prefix (Trie *nod, int i) {
if (i == dim or nod->fiu[ic] == 0)
return i;
return prefix(nod->fiu[ic], i + 1);
}
int main () {
while (fin >> op) {
fin >> c;
dim = c.size();
switch (op) {
case 0: adauga(T, 0); break;
case 1: sterge(T, 0); break;
case 2: fout << aparitii(T, 0) << '\n'; break;
case 3: fout << prefix(T, 0) << '\n'; break;
}
}
}