Pagini recente » Cod sursa (job #2942479) | Cod sursa (job #2167979) | Cod sursa (job #2362826) | Cod sursa (job #930531) | Cod sursa (job #2075087)
#include <cstdio>
#include <cstring>
using namespace std;
char cuv[30];
int lg, m;
struct nod
{
int nr, fii;
nod *lit[30];
nod()
{
for(int i=1;i<=26;i++)
lit[i]=NULL;
nr=0;
fii=0;
}
}*r;
void adunare(nod *v, int j)
{
if(j==lg)
{
v->nr++;
return;
}
if(v->lit[cuv[j]-'a'+1]==NULL)
{
v->lit[cuv[j]-'a'+1]=new nod();
v->fii++;
}
adunare(v->lit[cuv[j]-'a'+1], j+1);
}
int scadere(nod *v, int j)
{
if(j==lg)
v->nr--;
else
if(scadere(v->lit[cuv[j]-'a'+1], j+1))
{
v->fii--;
v->lit[cuv[j]-'a'+1]=NULL;
}
if(v->nr==0 && v->fii==0 && v!=r)
{
delete v;
return 1;
}
return 0;
}
int nr_aparitii(nod *v, int j)
{
if(j==lg)
return v->nr;
if(v->lit[cuv[j]-'a'+1]==NULL)
return 0;
return nr_aparitii(v->lit[cuv[j]-'a'+1], j+1);
}
int lung_max(nod *v, int j)
{
if(v==NULL)
return j-3;
return lung_max(v->lit[cuv[j]-'a'+1], j+1);
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
r=new nod();
while(fgets(cuv, 30, stdin))
{
cuv[strlen(cuv)-1]='\0';
m++;
lg=strlen(cuv);
switch(cuv[0]-'0')
{
case 0: adunare(r, 2); break;
case 1: scadere(r, 2); break;
case 2: printf("%d\n", nr_aparitii(r, 2)); break;
case 3: printf("%d\n", lung_max(r, 2));
}
}
return 0;
}