Pagini recente » Cod sursa (job #1482535) | Cod sursa (job #1607493) | Cod sursa (job #1270586) | Cod sursa (job #115195) | Cod sursa (job #1958292)
#include <cstdio>
#include <iostream>
using namespace std;
struct nod
{
int prefix,aparitii;
nod *nxt[26];
nod()//functie cu numele variabilei
{
prefix=0;
aparitii=0;
for(int i=0; i<26; i++)
nxt[i]=NULL;
}
} *rad;
char cuv[30];
int len_prefix( nod * act, char v[]){
if(act==NULL)
return -1;
if(v[0]==0)
return 0;
int val=len_prefix(act->nxt[v[0]-'a'], v+1);
return 1+val;
}
int search(nod *act, char v[])
{
if(act==NULL)
return 0;
if(v[0]==0)
{
return act->aparitii;
}
return search(act->nxt[v[0]-'a'], v+1);
}
nod *erase(nod *act, char v[])
{
act->prefix--;
if(v[0]==0)
{
act->aparitii--;
if(act->aparitii==0 && act->prefix==0)// act->prefix==0 e suficient
{
delete act;
act=NULL;
}
return act;
}
act->nxt[v[0]-'a'] = erase(act->nxt[v[0]-'a'], v+1);
if(act->prefix==0)
{
delete act;
act=NULL;
}
return act;
}
nod *insert(nod *act, char v[])// in v[0] avem mereu litera actuala, fiindca am primit ca
// parametru v+1, adica am taiat prima litera din fostul v
{
if(act==NULL)
{
act=new nod;
}
act->prefix++;
if( v[0] == 0 )
{
act->aparitii++;
return act;
}
act->nxt[ v[0]-'a' ] = insert(act->nxt[ v[0]-'a' ],v+1);//v[0] va fi in intervalul [96..96+26] unde se afla 'a'-'z' in codul ascii
//v[0]-'a' se va afla in intervalul [0,26), exact ce ne trebuie
return act;
}
int main()
{
ios_base::sync_with_stdio(false);
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int t;
while(scanf("%d ",&t)==1)
{
//cin>>cuv;
gets(cuv);
if(t==0)
{
rad=insert(rad,cuv);
}
if(t==1)
{
rad=erase(rad,cuv);
}
if(t==2)
cout<<search(rad,cuv)<<"\n";
if(t==3)
cout<<len_prefix(rad,cuv)<<"\n";
}
}