Pagini recente » Cod sursa (job #2227340) | Cod sursa (job #2957066) | Cod sursa (job #516079) | Cod sursa (job #1287851) | Cod sursa (job #2844879)
#include <bits/stdc++.h>
using namespace std;
int op;
char cuv[25];
struct Trie
{
int cnt,nrfii;
Trie *fiu[26];
Trie()
{
cnt=nrfii=0;
for(int i=0; i<26; i++)
fiu[i]=0;
}
};
Trie *t=new Trie;
void adauga(Trie *nod, char *s)
{
if(*s=='\0')
{
nod->cnt++;
}
else
{
if(nod->fiu[*s-'a']==0)
{
nod->fiu[*s-'a']=new Trie;
nod->nrfii++;
}
adauga(nod->fiu[*s-'a'],s+1);
}
}
int sterge(Trie *nod, char *s)
{
if(*s=='\0')
nod->cnt--;
else if(sterge(nod->fiu[*s-'a'],s+1))
{
nod->fiu[*s-'a']=0;
nod->nrfii--;
}
if(nod->cnt==0 && nod->nrfii==0 && nod!=t)
{
delete nod;
return 1;
}
return 0;
}
int numar_aparitii(Trie *nod, char *s)
{
if(*s=='\0')
return nod->cnt;
else if(nod->fiu[*s-'a'])
return numar_aparitii(nod->fiu[*s-'a'],s+1);
return 0;
}
int lungime_prefix_comun(Trie *nod, char *s, int k)
{
if(*s=='\0' || nod->fiu[*s-'a']==0)
return k;
return lungime_prefix_comun(nod->fiu[*s-'a'],s+1,k+1);
}
int main ()
{
ifstream cin("trie.in");
ofstream cout("trie.out");
while(cin >> op >> cuv)
{
if(op == 0)
{
adauga(t,cuv);
}
if(op == 1)
{
sterge(t,cuv);
}
if(op == 2)
{
cout << numar_aparitii(t,cuv) << '\n';
}
if(op == 3)
{
cout << lungime_prefix_comun(t,cuv,0) << '\n';
}
}
return 0;
}