Pagini recente » Cod sursa (job #2301287) | ojitime | Cod sursa (job #3185190) | Cod sursa (job #148308) | Cod sursa (job #1379160)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
struct Trie {
int nrCuvinte;
int nrFii;
Trie *fiu[27];
Trie() {
nrCuvinte = 0;
nrFii = 0;
for (int i = 0; i < 27; i++)
fiu[i] = NULL;
}
};
Trie *root = new Trie;
string s;
void adauga(int index, Trie *lista) {
if (index == s.size()) {
lista -> nrCuvinte++;
return;
}
int letter = s[index] - 'a';
if (lista -> fiu[letter] == NULL) {
lista -> fiu[letter] = new Trie();
lista -> nrFii++;
}
adauga(index+1, lista->fiu[letter]);
}
bool sterge(int index, Trie *lista) {
if (index == s.size())
lista -> nrCuvinte--;
else {
int letter = s[index] - 'a';
if (sterge(index+1, lista -> fiu[letter])) {
lista -> fiu[letter] = NULL;
lista -> nrFii--;
}
}
if (lista->nrCuvinte == 0 && lista->nrFii == 0 && lista != root) {
delete lista;
return 1;
}
return 0;
}
int nrAparitii(int index, Trie *lista) {
if (index == s.size())
return lista -> nrCuvinte;
if (lista -> fiu[s[index]-'a'] == NULL)
return 0;
return nrAparitii(index+1, lista->fiu[s[index]-'a']);
}
int lungimePrefix(int index, Trie *lista, int x) {
if (index == s.size() || lista -> fiu[s[index]-'a'] == NULL)
return x;
return lungimePrefix(index+1, lista->fiu[s[index]-'a'], x+1);
}
int main() {
ifstream fin("trie.in");
ofstream fout("trie.out");
for (;getline(fin, s);) {
switch (s[0]) {
case '0':
adauga(2, root);
break;
case '1':
sterge(2, root);
break;
case '2':
fout << nrAparitii(2, root) << "\n";
break;
case '3':
fout << lungimePrefix(2, root, 0) << "\n";
break;
}
}
fin.close();
fout.close();
return 0;
}