Pagini recente » Cod sursa (job #52467) | Cod sursa (job #44129) | Cod sursa (job #654821) | Cod sursa (job #126300) | Cod sursa (job #1146025)
#include <fstream>
#include <memory.h>
#define L *Cuvant - 'a'
using namespace std;
class Trie
{
private:
int NrCuv, NrFii;
public:
Trie *F[30];
Trie()
{
NrCuv = NrFii = 0;
memset(F, sizeof(F), 0);
}
void Inserare(char *Cuvant)
{
if (*Cuvant)
{
if (!F[L])
{
F[L] = new Trie;
NrFii++;
}
F[L] -> Inserare(Cuvant + 1);
}
else
NrCuv++;
}
bool Stergere(char *Cuvant)
{
if (!*Cuvant)
NrCuv--;
else if (F[L] -> Stergere(Cuvant + 1))
{
delete F[L];
F[L] = 0;
NrFii--;
}
if (NrCuv || NrFii)
return false;
return true;
}
int NrApar(char *Cuvant)
{
if (*Cuvant)
{
if (F[L])
return F[L] -> NrApar(Cuvant + 1);
return 0;
}
return NrCuv;
}
int Prefix(char *Cuvant, int lg)
{
if (*Cuvant)
{
if (F[L])
return F[L] -> Prefix(Cuvant + 1, lg + 1);
}
return lg;
}
} T;
ifstream fin("trie.in");
ofstream fout("trie.out");
void Rezolvare()
{
int op;
char cuv[30];
while(fin >> op >> cuv)
{
if (op == 0)
T.Inserare(cuv);
else if (op == 1)
T.Stergere(cuv);
else if (op == 2)
fout << T.NrApar(cuv) << "\n";
else
fout << T.Prefix(cuv, 0) << "\n";
}
}
int main()
{
Rezolvare();
return 0;
}