Pagini recente » Cod sursa (job #3198413) | Cod sursa (job #2722521) | Cod sursa (job #427212) | Cod sursa (job #2862939) | Cod sursa (job #2558697)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
int n;
char c[27];
struct trie
{
int nrcuv,nrfii;
trie *fii[27];
trie()
{
nrcuv=nrfii=0;
for(int i=0;i<27;i++)
{
fii[i]=0;
}
}
};
trie *sol;
void add(trie* nod,char* x)
{
if(*x==0)
{
nod->nrcuv++;
return;
}
if(nod->fii[*x-'a']==0)
{
nod->fii[*x-'a']=new trie;
nod->nrfii++;
}
add(nod->fii[*x-'a'],x+1);
}
int sterge(trie* nod,char*x)
{
if(*x==0)
{
nod->nrcuv--;
if(nod->nrcuv==0 && nod->nrfii==0 && nod!=sol){delete nod;return 1;}
return 0;
}
if(sterge(nod->fii[*x-'a'],x+1)==1)
{
nod->nrfii--;
nod->fii[*x-'a']=0;
if(nod->nrcuv==0 && nod->nrfii==0 && nod!=sol){delete nod;return 1;}
}
return 0;
}
int tip(trie* nod,char *x)
{
if(*x==0)
{
return nod->nrcuv;
}
if(nod->nrfii==0)
{
return 0;
}
return tip(nod->fii[*x-'a'],x+1);
}
int pref(trie *nod,char *x)
{
if(*x==0)
{
if(nod->nrcuv)
return 1;
return 0;
}
if(nod->fii[*x-'a']==0)return 0;
return pref(nod->fii[*x-'a'],x+1)+1;
}
int main()
{
sol=new trie;
while(in>>n>>c)
{
if(n==0)add(sol,c);
if(n==1)sterge(sol,c);
if(n==2)out<<tip(sol,c)<<'\n';
if(n==3)out<<pref(sol,c)<<'\n';
}
return 0;
}