Pagini recente » Cod sursa (job #1802126) | Cod sursa (job #1193907) | Cod sursa (job #2497023) | Cod sursa (job #687453) | Cod sursa (job #2909003)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
int cnt,nrfii;
Trie *fiu[26];
Trie()
{
cnt=nrfii=0;
memset(fiu,0,sizeof(fiu));
}
};
Trie *T=new Trie;
void Adaugare(Trie *nod,char *s)
{
if(*s==NULL) {nod->cnt++;return;}
if(!nod->fiu[*s-'a'])
{
nod->fiu[*s-'a']=new Trie;
nod->nrfii++;
}
Adaugare(nod->fiu[*s-'a'],s+1);
}
bool Stergere(Trie *nod,char *s)
{
if(*s==NULL) nod->cnt--;
else if(Stergere(nod->fiu[*s-'a'],s+1))
nod->fiu[*s-'a']=0,nod->nrfii--;
if(!nod->cnt && !nod->nrfii && nod!=T)
{
delete nod;
return 1;
}
return 0;
}
int NrAparitii(Trie *nod,char *s)
{
if(*s==NULL) return nod->cnt;
if(nod->fiu[*s-'a'])return NrAparitii(nod->fiu[*s-'a'],s+1);
return 0;
}
int Prefix(Trie *nod,char *s,int nivel)
{
if(*s==NULL || !nod->fiu[*s-'a']) return nivel;
else return Prefix(nod->fiu[*s-'a'],s+1,nivel+1);
}
int main()
{
int op;
char s[30];
while(fin>>op>>s)
switch (op)
{
case 0:Adaugare(T,s);break;
case 1:Stergere(T,s);break;
case 2:fout<<NrAparitii(T,s)<<"\n";break;
case 3:fout<<Prefix(T,s,0)<<"\n";break;
}
return 0;
}