Pagini recente » Cod sursa (job #2007775) | Cod sursa (job #2160090) | Cod sursa (job #1292998) | Cod sursa (job #1337140) | Cod sursa (job #1163136)
#include<fstream>
#define LIT 27
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nod
{
int nrap, nrfii;
nod *urm[LIT];
nod()
{
int i;
nrap=nrfii=0;
for (i=0; i<LIT; ++i) urm[i]=NULL;
}
}*radacina;
char cuv[LIT];
int ok;
void Adauga()
{
int i=0;
nod *p, *q;
p=radacina;
while (cuv[i]!='\0')
{
if (p->urm[cuv[i]-'a']) p=p->urm[cuv[i]-'a'];
else
{
q=new nod; ++p->nrfii;
p->urm[cuv[i]-'a']=q;
p=q;
}
++i;
}
++(p->nrap);
}
bool Sterge(int pz, nod* p)
{
int lit=cuv[pz]-'a';
bool x;
if (cuv[pz]=='\0') p->nrap--;
else
{
x=Sterge(pz+1, p->urm[lit]);
if (x)
{
p->urm[lit]=NULL;
--p->nrfii;
}
}
if (p->nrfii==0 && p->nrap==0 && p!=radacina)
{
delete p;
return true;
}
return false;
}
int numar_aparitii()
{
int i=0;
nod *p, *q;
p=radacina;
for (i=0; cuv[i]!='\0'; p=p->urm[cuv[i]-'a'], ++i)
if (!p->urm[cuv[i]-'a']) return 0;
return p->nrap;
}
int prefix(int pz, nod *p)
{
int i;
for (i=0; cuv[i]!='\0'; p=p->urm[cuv[i]-'a'], ++i)
if (p->urm[cuv[i]-'a']==NULL) return i;
return i;
}
int main()
{
int op;
radacina=new nod;
while (f>>op>>cuv)
if (!op) Adauga();
else if (op==1) Sterge(0, radacina);
else if (op==2) g<<numar_aparitii()<<"\n";
else g<<prefix(0, radacina)<<"\n";
f.close();
g.close();
return 0;
}