Pagini recente » Cod sursa (job #358324) | Cod sursa (job #536708) | Cod sursa (job #617621) | Cod sursa (job #404836) | Cod sursa (job #1251546)
#include <cstdio>
#include <cstring>
FILE* in=fopen("trie.in","r");
FILE* out=fopen("trie.out","w");
struct Nod{
int nrp,nrc;
Nod* fii[26];
Nod()
{
nrp=0;
nrc=0;
for(int i=0; i<26; i++)
{
fii[i]=NULL;
}
}
};
Nod *adauga(Nod *p, char *cuv)
{
if(p==NULL)
p=new Nod;
p->nrp++;
if(cuv[0]!=0)
p->fii[cuv[0]-'a']=adauga(p->fii[cuv[0]-'a' ],cuv+1);
else
p->nrc++;
return p;
}
Nod *sterge(Nod *p, char *cuv)
{
p->nrp--;
if(cuv[0]!=0)
p->fii[cuv[0]-'a']=sterge(p->fii[cuv[0]-'a'],cuv+1);
else
p->nrc--;
if(p->nrp==0)
{
delete p;
p=NULL;
}
return p;
}
int app(Nod *p, char *cuv)
{
if(p==NULL)
return 0;
if(cuv[0]==0)
return p->nrc;
return app(p->fii[cuv[0]-'a'],cuv+1);
}
int pref(Nod *p,char *cuv)
{
if(cuv[0]==0)
return 0;
if(p==NULL)
return -1;
return (1+pref(p->fii[cuv[0]-'a'],cuv+1));
}
int main()
{
int t;
char v[22];
memset(v,0,sizeof v);
Nod *start;
start=new Nod;
while(fscanf(in,"%d %s",&t,&v)>0)
{
if(t==0)
{
adauga(start,&v[0]);
}
else if(t==1)
{
sterge(start,&v[0]);
}
else if(t==2)
{
fprintf(out,"%d\n",app(start,&v[0]));
}
else
{
fprintf(out,"%d\n",pref(start,&v[0]));
}
}
return 0;
}