Pagini recente » Cod sursa (job #2617183) | Cod sursa (job #2155961) | Cod sursa (job #658842) | Cod sursa (job #3192775) | Cod sursa (job #2075082)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char cuv[30],l, m=1;
int lg;
struct nod
{
int nr, fii;
nod *lit[30];
nod()
{
for(int i=0; i<27; ++i)
lit[i]=0;
nr=0;
fii=0;
}
}*r;
void adaug(nod *v, int j)
{
if(j==lg)
{
v->nr++;
return;
}
if(v->lit[cuv[j]-'a']==NULL)
{
v->lit[cuv[j]-'a']=new nod();
v->fii++;
}
adaug(v->lit[cuv[j]-'a'], j+1);
}
int sterg(nod *v, int j)
{
if(j==lg)
v->nr--;
else if(sterg(v->lit[cuv[j]-'a'], j+1))
{
v->fii--;
v->lit[cuv[j]-'a']=0;
//return 0;
}
if(v->nr==0 && v->fii==0 && r!=v)
{
delete v;
return 1;
}
return 0;
}
void aparitii(nod *v, int j)
{
if(j==lg)
{
printf("%d\n", v->nr);
return;
}
if(v->lit[cuv[j]-'a']==NULL)
{
printf("0\n");
return ;
}
aparitii(v->lit[cuv[j]-'a'], j+1);
}
int lg_prefix(nod *v, int j)
{
if(v== NULL)
return j-3;
return lg_prefix(v->lit[cuv[j]-'a'],j+1);
}
void citire()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
r=new nod;
while(fgets(cuv,30,stdin))
{
lg=strlen(cuv)-1;
switch(cuv[0]-'0')
{
case 0:
adaug(r,2);
break;
case 1:
sterg(r,2);
break;
case 2:
aparitii(r,2);
break;
case 3:
cout<<lg_prefix(r,2)<<endl;
break;
}
m++;
}
}
int main()
{
citire();
return 0;
}