Pagini recente » Cod sursa (job #2297973) | Cod sursa (job #3147476) | Cod sursa (job #357537) | Cod sursa (job #2392629) | Cod sursa (job #3333846)
#include <fstream>
#include <cstring>
using namespace std;
const int NL = 26;
const int NLC = 20;
struct nod
{
int nr_pref, nr_cuv;
nod* fiu[NL];
nod()
{
nr_pref = nr_cuv = 0;
for (int i = 0; i < NL; i++)
{
fiu[i] = NULL;
}
}
};
nod* adauga(nod* p, char cuv[])
{
if (p == NULL)
{
p = new nod;
}
p->nr_pref++;
if (cuv[0] == '\0')
{
p->nr_cuv++;
}
else
{
int poz_alfa = cuv[0]-'a';
p->fiu[poz_alfa] = adauga(p->fiu[poz_alfa], cuv + 1);
}
return p;
}
nod* sterge(nod* p, char cuv[])
{
p->nr_pref--;
if (cuv[0] == '\0')
{
p->nr_cuv--;
}
else
{
int poz_alfa = cuv[0]-'a';
p->fiu[poz_alfa] = sterge(p->fiu[poz_alfa], cuv + 1);
}
if (p->nr_pref == 0)
{
delete p;
p = NULL;
}
return p;
}
int aparitii_cuv(nod* p, char cuv[])
{
if (p == NULL)
{
return 0;
}
if (cuv[0] == '\0')
{
return p->nr_cuv;
}
int poz_alfa = cuv[0]-'a';
return aparitii_cuv(p->fiu[poz_alfa], cuv + 1);
}
int lungime_prefix(nod* p, char cuv[])
{
if (p == NULL)
{
return -1;
}
if (cuv[0] == '\0')
{
return 0;
}
int poz_alfa = cuv[0]-'a';
return 1 + lungime_prefix(p->fiu[poz_alfa], cuv + 1);
}
int main()
{
ifstream in("trie.in");
ofstream out("trie.out");
int tip;
char cuv[NLC+1];
nod* rad = NULL;
while (in >> tip >> cuv)
{
if (tip == 0)
{
rad = adauga(rad, cuv);
}
else if (tip == 1)
{
rad = sterge(rad, cuv);
}
else if (tip == 2)
{
out << aparitii_cuv(rad, cuv) << "\n";
}
else
{
out << lungime_prefix(rad, cuv) << "\n";
}
}
in.close();
out.close();
return 0;
}