Pagini recente » Cod sursa (job #2743328) | Cod sursa (job #3217532) | Cod sursa (job #3039668) | Cod sursa (job #87052) | Cod sursa (job #2444090)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct nod{
nod *c[26];
int aparitii,prefixe;
nod() {
for (int i = 0; i < 26; i++) {
c[i] = NULL;
}
aparitii = prefixe = 0;
}
}*radacina;
void adauga(nod *&actual,string s)
{
///cerr << s << "\n";
if (actual == NULL)
{
actual = new nod;
}
actual->prefixe++;
if(s.length() == 0) {
actual->aparitii++;
return;
}
adauga(actual->c[s[0] - 'a'], s.substr(1));
}
void sterge(nod *&actual,string s)
{
actual->prefixe--;
if (s.length() == 0)
{
actual->aparitii--;
return;
}
sterge(actual->c[s[0] - 'a'], s.substr(1));
if (actual->prefixe == 0) {
delete actual;
actual = NULL;
}
}
int cnt_aparitii(nod *&actual,string s)
{
if (actual == NULL)
{
return 0;
}
if (s.length() == 0)
{
return actual->aparitii;
}
return cnt_aparitii(actual->c[s[0] - 'a'], s.substr(1));
}
int cnt_prefix(nod *&actual,string s)
{
if (s.length() == 0)
{
return 0;
}
if (actual != NULL && actual->prefixe > 0)
{
return 1 + cnt_prefix(actual->c[s[0] - 'a'], s.substr(1));
}
return -1;
}
int main()
{
int op;
string s;
while (in >> op >> s)
{
if (op == 0)
{
adauga(radacina,s);
}
if (op == 1)
{
sterge(radacina,s);
}
if (op == 2)
{
out << cnt_aparitii(radacina,s) << "\n";
}
if (op == 3)
{
out << cnt_prefix(radacina,s) << "\n";
}
}
return 0;
}