Pagini recente » Cod sursa (job #965087) | Monitorul de evaluare | nume | Cod sursa (job #949056) | Cod sursa (job #2553564)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int n;
char s[23];
struct trie
{
int nrap,nrfii;
trie *fii[26];
trie()
{
nrap=nrfii=0;
for(int i=0;i<26;i++)
fii[i]=0;
}
};
trie *t=new trie;
void adaug(trie *nod,char s[23])
{
if(*s=='\0')
{
nod->nrap++;
return;
}
if(nod->fii[*s-'a']==0)
{
nod->fii[*s-'a']=new trie;
nod->nrfii++;
}
adaug(nod->fii[*s-'a'],s+1);
}
int sterg(trie *nod,char *s)
{
if(*s=='\0')
nod->nrap--;
else if(sterg(nod->fii[*s-'a'],s+1))
{
nod->fii[*s-'a']=0;
nod->nrfii--;
}
if(nod->nrap==0&&nod->nrfii==0&&nod!=t)
{
delete nod;
return 1;
}
return 0;
}
int apar(trie *nod,char *s)
{
if(*s=='\0')
return nod->nrap;
if(nod->fii[*s-'a']!=0)
return apar(nod->fii[*s-'a'],s+1);
return 0;
}
int pref(trie *nod,char *s,int p)
{
if(*s=='\0'||nod->fii[*s-'a']==0)
return p;
return pref(nod->fii[*s-'a'],s+1,p+1);
}
void citire()
{
ifstream fin("trie.in");
ofstream fout("trie.out");
while(fin>>n)
{
fin>>s;
if(n==0)
adaug(t,s);
else if(n==1)
sterg(t,s);
else if(n==2)
fout<<apar(t,s)<<"\n";
else
fout<<pref(t,s,0)<<"\n";
}
}
int main()
{
citire();
return 0;
}