Pagini recente » Monitorul de evaluare | Diferente pentru runda/redsnow_3 intre reviziile 36 si 54 | Diferente pentru home intre reviziile 902 si 457 | Istoria paginii utilizator/stoianrares | Cod sursa (job #2336124)
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie
{
short aparitii,fii;
trie *fiu[26];
trie()
{
aparitii=fii=0;
for(int i=0;i<26;i++)
fiu[i]=0;
}
}*tata;
void adauga(trie *nod,char *s)
{
if(*s==NULL)
{
nod->aparitii++;
return;
}
if(!nod->fiu[*s-'a'])
{
nod->fiu[*s-'a']=new trie;
nod->fii++;
}
adauga(nod->fiu[*s-'a'],s+1);
}
void sterge(trie *nod,char *s)
{
if(*s==NULL)
{
nod->aparitii--;
return ;
}
sterge(nod->fiu[*s-'a'],s+1);
if(!nod->fiu[*s-'a']->fii && !nod->fiu[*s-'a']->aparitii)
{
delete nod->fiu[*s-'a'];
nod->fii--;
nod->fiu[*s-'a']=NULL;
}
}
int numar(trie *nod, char *s)
{
if(*s==NULL)
return nod->aparitii;
if(!nod->fiu[*s-'a'])
return 0;
return numar(nod->fiu[*s-'a'],s+1);
}
int prefix(trie *nod, char *s)
{
if(*s==NULL)
return 0;
if(!nod->fiu[*s-'a'])
return 0;
return prefix(nod->fiu[*s-'a'],s+1)+1;
}
int main()
{
tata=new trie;
char cuv[25];
int op;
while(fin>>op>>cuv)
{
if(op==0)
{
adauga(tata,cuv);
continue;
}
if(op==1)
{
sterge(tata,cuv);
continue;
}
if(op==2)
{
fout<<numar(tata,cuv)<<"\n";
continue;
}
fout<<prefix(tata,cuv)<<"\n";
}
return 0;
}