Pagini recente » Cod sursa (job #1918651) | Cod sursa (job #2825505) | Cod sursa (job #3197470) | Cod sursa (job #2442804) | Cod sursa (job #1893681)
#include <fstream>
#include <cstring>
#include <memory.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Nod
{
int nrc,nrp;
Nod *fii[26];
Nod()
{
nrc=nrp=0;
memset(fii,0,sizeof(fii));
}
};
int op;
char v[30],s[25];
Nod *nod= new Nod;
void adauga(Nod *p, char *s)
{
if(*s==0)
{
p->nrc++;
return;
}
if(p->fii[*s-'a']==0)
{
p->fii[*s-'a']=new Nod;
p->nrp++;
}
adauga(p->fii[*s-'a'], s+1);
}
int delcuv(Nod *p,char *s)
{
if(*s<'a')
nod->nrc--;
else if(delcuv(p->fii[*s-'a'],s+1)){
nod->fii[*s-'a']=0;
nod->nrp--;
}
if(p->nrc==0 && p->nrp==0 && p!=nod)
{
delete p;
return 1;
}
return 0;
}
int apcuv(Nod *p, char *s)
{
if(*s<'a')
{
return p->nrc;
}
if(p->fii[*s-'a'])
{
return apcuv(p->fii[*s-'a'],s+1);
}
return 0;
}
int prefix(Nod *p, char *s,int k)
{
if(*s<'a' || p==0 ||p->fii[*s-'a']==0)
return k;
return prefix(nod->fii[*s-'a'],s+1,k+1);
}
int main()
{
while(fin.getline(v,30))
{
op=v[0]-'0';
if(op==0)
adauga(nod,v+2);
else if(op==1)
delcuv(nod,v+2);
else if(op==2)
fout<<apcuv(nod,v+2)<<'\n';
else
fout<<prefix(nod,v+2,0)<<'\n';
}
return 0;
}