Pagini recente » Istoria paginii runda/mf_boss3 | Cod sursa (job #3209372) | Cod sursa (job #1855804) | Cod sursa (job #1792685) | Cod sursa (job #2175145)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
char ss[28];
struct trie
{
int cn,nr;
trie *fiu[27];
trie()
{
cn=nr=0;
memset(fiu,0,sizeof(fiu));
}
};
trie *t=new trie;
void adauga(trie *nod,char *s)
{
if(*s==NULL)
{
nod->cn++;
return;
}
if(!nod->fiu[*s-'a'])
{
nod->fiu[*s-'a']=new trie;
nod->nr++;
}
adauga(nod->fiu[*s-'a'],s+1);
}
int del(trie *nod,char *s)
{
if(*s==NULL)
{
nod->cn--;
}
else
{
if(del(nod->fiu[*s-'a'],s+1)==1)
{
nod->fiu[*s-'a']=0;
nod->nr--;
}
}
if(nod->cn==0&&nod->nr==0&&nod!=t)
{
delete nod;
return 1;
}
return 0;
}
int nr_apar(trie *nod,char *s)
{
if(*s==NULL)
return nod->cn;
if(nod->fiu[*s-'a'])
return nr_apar(nod->fiu[*s-'a'],s+1);
return 0;
}
int pre(trie *nod,char *s,int k)
{
if(*s==NULL||!nod->fiu[*s-'a'])
return k;
pre(nod->fiu[*s-'a'],s+1,k+1);
}
int main()
{
fin.getline(ss,28);
while(!fin.eof())
{
if(ss[0]=='0')
adauga(t,ss+2);
if(ss[0]=='1')
del(t,ss+2);
if(ss[0]=='2')
fout<<nr_apar(t,ss+2)<<"\n";
if(ss[0]=='3')
fout<<pre(t,ss+2,0)<<"\n";
fin.getline(ss,28);
}
return 0;
}