Pagini recente » Cod sursa (job #449053) | Cod sursa (job #2726107) | Cod sursa (job #2916348) | Cod sursa (job #2922088) | Cod sursa (job #2075135)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct nod
{
int cost,nrfii;
nod *fii[26];
nod()
{
for(int i=0;i<26;++i)
fii[i]=0;
cost=0;
nrfii=0;
}
}*r;
char txt[30];
int k,leg;
void adaugare(nod *&n, char l)
{
if(l=='\n')
{
n->cost++;
return ;
}
if(n->fii[l-'a']==0)
n->fii[l-'a']=new nod(), n->nrfii++;
adaugare(n->fii[l-'a'], txt[++k]);
}
int aparitii(nod *&n, char l)
{
if(l=='\n')
return n->cost;
if(n->fii[l-'a']==0)
return 0;
return aparitii(n->fii[l-'a'],txt[++k]);
}
bool stergere(nod *&n, char l)
{
if(l=='\n')
{
n->cost--;
}
else if(stergere(n->fii[l-'a'],txt[++k]))
{
n->fii[l-'a']=0, n->nrfii--;
}
if(n->cost==0 && n->fii==0 && n!=r)
{
delete n;
return 1;
}
return 0;
}
int prefix(nod *&n, char l, int ad=0)
{
if(n==0)
return ad-1;
if(l=='\n')
return ad;
return prefix(n->fii[l-'a'],txt[++k],ad+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
r=new nod();
while(fgets(txt,30,stdin))
{
k=2;
//getline(cin,txt);
if(txt[0]=='0')
{
adaugare(r,txt[k]);
}
if(txt[0]=='1')
stergere(r,txt[k]);
if(txt[0]=='2')
cout<<aparitii(r,txt[k])<<"\n";
if(txt[0]=='3')
cout<<prefix(r,txt[k])<<"\n";
}
return 0;
}