Pagini recente » Cod sursa (job #931841) | Cod sursa (job #2295110) | Cod sursa (job #963058) | Cod sursa (job #1456671) | Cod sursa (job #3281772)
#include <fstream>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
const int NL = 26;
const int LC = 20;
struct nod
{
nod* fii[NL];
int nr_cuvinte;
nod()
{
nr_cuvinte = 0;
for (int i = 0; i < NL; i++)
{
fii[i] = NULL;
}
}
};
bool este_frunza(nod* p)
{
for (int i = 0; i < NL; i++)
{
if (p->fii[i] != NULL)
{
return false;
}
}
return true;
}
nod* adauga(nod* p, char cuv[])
{
if (p == NULL)
{
p = new nod;
}
if (cuv[0] == '\0')///suntem la finalul cuvantului pe care-l adaugam
{
p->nr_cuvinte++;
}
else
{
int poz_litera = (int)(cuv[0] - 'a');
p->fii[poz_litera] = adauga(p->fii[poz_litera], cuv + 1);
}
return p;
}
nod* sterge(nod* p, char cuv[])
{
if (cuv[0] == '\0')
{
p->nr_cuvinte--;
}
else
{
int poz_litera = (int)(cuv[0] - 'a');
p->fii[poz_litera] = sterge(p->fii[poz_litera], cuv + 1);
}
if (este_frunza(p) && p->nr_cuvinte == 0)///p este o frunza
{
delete p;
p = NULL;
}
return p;
}
int aparitii(nod* p, char cuv[])
{
if (cuv[0] == '\0')///suntem la finalul cuvantului verificat
{
return p->nr_cuvinte;
}
int poz_litera = (int)(cuv[0] - 'a');
if (p->fii[poz_litera] != NULL)
{
return aparitii(p->fii[poz_litera], cuv + 1);
}
return 0;
}
int lung_prefix(nod* p, char cuv[])
{
if (p == NULL || cuv[0] == '\0')///suntem la finalul cuvantului verificat
{
return 0;
}
int poz_litera = (int)(cuv[0] - 'a');
if (p->fii[poz_litera] == NULL)
{
return 0;
}
return 1 + lung_prefix(p->fii[poz_litera], cuv + 1);
}
int main()
{
char cuvant[LC+1];
int tip;
nod *radacina = NULL;
while (in >> tip >> cuvant)
{
if (tip == 0)
{
radacina = adauga(radacina, cuvant);
}
else if (tip == 1)
{
radacina = sterge(radacina, cuvant);
}
else if (tip == 2)
{
out << aparitii(radacina, cuvant) << "\n";
}
else///tip == 3
{
out << lung_prefix(radacina, cuvant) << "\n";
}
}
return 0;
}