Pagini recente » Cod sursa (job #1936748) | Cod sursa (job #1877461) | Cod sursa (job #1042022) | Monitorul de evaluare | Cod sursa (job #1376885)
#include <cstdio>
#include <cstring>
FILE* in, *out;
using namespace std;
char cuv[21];
struct Nod {
int nrp, nrc;
Nod* fii[26];
Nod()
{
nrp = nrc = 0;
memset(fii, 0, sizeof(fii));
}
};
void adauga(Nod*p,char* cuv)
{
p->nrp++;
if(cuv[0] == 0)
{
p->nrc++;
return;
}
if(p->fii[cuv[0]-'a'] == 0)
p->fii[cuv[0]-'a'] = new Nod();
adauga(p->fii[cuv[0]-'a'],cuv+1);
}
void sterge(Nod* p, char* cuv)
{
p->nrp--;
if(cuv[0] == 0)
{
p->nrc--;
return;
}
sterge(p->fii[cuv[0]-'a'], cuv+1);
}
int howMany(Nod *p, char* cuv)
{
if(cuv[0] == 0)
return p->nrc;
if(p->fii[cuv[0]-'a'] == 0) return 0;
return howMany(p->fii[cuv[0]-'a'],cuv+1);
}
int prefix(Nod *p, char* cuv)
{
if(p->nrp == 0) return 0;
if(cuv[0] == 0) return 1;
if(p->fii[cuv[0]-'a'] == 0) return 1;
return 1 + prefix(p->fii[cuv[0]-'a'],cuv+1);
}
int maxim(int a, int b)
{
return (a>b)?a:b;
}
int main()
{
in = fopen("trie.in","r");
out = fopen("trie.out","w");
Nod* p = new Nod();
int type;
while(fscanf(in,"%d ", &type) != EOF)
{
fscanf(in, "%s\n", cuv);
if(type == 0)
adauga(p,cuv);
else if(type == 1)
sterge(p,cuv);
else if(type == 2)
fprintf(out, "%d\n", howMany(p,cuv));
else fprintf(out, "%d\n", maxim(0,prefix(p,cuv)-1));
}
fcloseall();
return 0;
}