Pagini recente » Cod sursa (job #260973) | Cod sursa (job #70408) | Cod sursa (job #2175623) | Cod sursa (job #600375) | Cod sursa (job #433229)
Cod sursa(job #433229)
#include <cstdio>
struct nod
{
int val;
nod* litera[28];
};
nod rad;
char cuv[22];
void adauga()
{
nod *p=&rad,*pold=&rad;
rad.val++;
for (int i=0;cuv[i];++i)
{
if ((*p).litera[cuv[i]-'a']!=NULL)
{
p=(*p).litera[cuv[i]-'a'];
pold=p;
(*p).val++;
continue;
}
p=new nod;
(*p).val=0;
for (int j=0;j<28;++j)
(*p).litera[j]=NULL;
(*pold).litera[cuv[i]-'a']=p;
(*p).val++;
pold=p;
}
}
void sterge()
{
nod *pold=&rad;
nod *p=rad.litera[cuv[0]-'a'];
nod *pnew=p;
(*p).val--;
(*pold).val--;
int i;
for (i=1;cuv[i];++i)
{
pnew=(*p).litera[cuv[i]-'a'];
(*pnew).val--;
if ((*p).val==0)
{
delete p;
(*pold).litera[cuv[i-1]-'a']=NULL;
}
pold=p;
p=pnew;
}
if ((*p).val==0)
{
delete p;
(*pold).litera[cuv[i-1]-'a']=NULL;
}
}
int aparitii()
{
nod *p=&rad;
for (int i=0;cuv[i];++i)
{
if ((*p).litera[cuv[i]-'a']==NULL)
return 0;
p=(*p).litera[cuv[i]-'a'];
}
int nr=(*p).val;
for (int i=0;i<28;++i)
{
nod *r=(*p).litera[i];
if (r!=NULL)
nr-=(*r).val;
}
return nr;
}
int prefix()
{
nod *p=&rad;
int i;
for (i=0;cuv[i];++i)
{
if ((*p).litera[cuv[i]-'a']==NULL)
return i;
p=(*p).litera[cuv[i]-'a'];
}
return i;
}
int main()
{
freopen ("trie.in","r",stdin);
freopen ("trie.out","w",stdout);
int cod;
while (scanf("%d ",&cod)!=EOF)
{
gets(cuv);
if (cod==0)
adauga();
if (cod==1)
sterge();
if (cod==2)
printf("%d\n",aparitii());
if (cod==3)
printf("%d\n",prefix());
}
return 0;
}