Pagini recente » Cod sursa (job #833017) | Cod sursa (job #864984) | Cod sursa (job #1692113) | Cod sursa (job #1604351) | Cod sursa (job #2202225)
#include <iostream>
#include <fstream>
using namespace std;
struct Trie
{
int nrap,nrfii;
Trie *fiu[26];
Trie()
{
nrap=nrfii=0;
for (int i=0; i<26; i++)
fiu[i]=0;
}
};
Trie *T=new Trie;
void ad(Trie *nod, char *s)
{
if (*s=='\0')
{
nod->nrap++;
return;
}
if (nod->fiu[*s-'a']==0)
{
nod->fiu[*s-'a'] = new Trie;
nod->nrfii++;
}
ad(nod->fiu[*s-'a'],s+1);
}
bool sterge(Trie *nod, char *s)
{
if (*s=='\0')
nod->nrap--;
else if (sterge(nod->fiu[*s-'a'],s+1))
{
nod->fiu[*s-'a']=0;
nod->nrfii--;
}
if (nod->nrap==0 && nod->nrfii==0 && nod!=T)
{
delete nod;
return true;
}
return false;
}
int ap(Trie *nod,char *s)
{
if (*s=='\0')
return nod->nrap;
if (nod->fiu[*s-'a']!=0)
return ap(nod->fiu[*s-'a'],s+1);
return 0;
}
int lpref(Trie *nod, char *s, int k)
{
if (*s=='\0' || nod->fiu[*s-'a']==0)
return k;
return lpref(nod->fiu[*s-'a'],s+1,k+1);
}
int main()
{
ifstream fin ("trie.in");
ofstream fout ("trie.out");
char cer,a[21];
while (fin>>cer)
{
fin>>a;
switch(cer)
{
case '0':
{
ad(T,a);
break;
}
case '1':
{
sterge(T,a);
break;
}
case '2':
{
fout<<ap(T,a)<<'\n';
break;
}
case '3':
{
fout<<lpref(T,a,0)<<'\n';
break;
}
}
}
return 0;
}