Pagini recente » Cod sursa (job #2608086) | Cod sursa (job #954054) | Cod sursa (job #2690163) | Cod sursa (job #424621) | Cod sursa (job #471139)
Cod sursa(job #471139)
#include <string.h>
#include <stdio.h>
struct nod
{nod* next[26];
nod* prev;
int count;
}*varf;
void init()
{varf=new nod;
varf->prev=0;
for (int i=0;i<26;i++)
{varf->next[i]=0;
}
varf->count=0;
}
void adauga(char *cuv)
{nod* p=varf,*q;
for (char *c=cuv;*c;c++)
{if(p->next[*c-'a']==NULL)
{q=new nod;
q->prev=p;
q->count=0;
for (int i=0;i<26;i++)
{q->next[i]=0;
}
p->next[*c-'a']=q;
p=q;
}
else
{p=p->next[*c-'a'];
}
}
p->count++;
}
void sterge(char *cuv)
{nod* p=varf;
int l=strlen(cuv)-1,i,flag;
for (i=0;cuv[i];i++)
{p=p->next[cuv[i]-'a'];
}
p->count--;
if(p->count==0)
{do
{flag=1;
for (i=0;i<26;i++)
{if(p->next[i]!=NULL)
{flag=0;
break;
}
}
if(flag)
{p=p->prev;
delete p->next[cuv[l]-'a'];
p->next[cuv[l]-'a']=0;
l--;
}
}
while(flag&&l>=0);
}
}
int nr_ap(char *cuv)
{int i;
nod* p=varf;
for (i=0;cuv[i];i++)
{p=p->next[cuv[i]-'a'];
}
return p->count;
}
int nr_pr(char *cuv)
{int i;
nod* p=varf;
for (i=0;cuv[i];i++)
{if(p->next[cuv[i]-'a']!=NULL)
{p=p->next[cuv[i]-'a'];}
else
{break;
}
}
return i;
}
int main ()
{freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
init();
int opt;
char cuv[40];
while(!feof(stdin))
{scanf("%d%s\n",&opt,cuv);
switch(opt)
{case 0:adauga(cuv);break;//adauga
case 1:sterge(cuv);break;//sterge
case 2:printf("%d\n",nr_ap(cuv));break;//nr aparitii
case 3:printf("%d\n",nr_pr(cuv));break;//cmmdc
}
}
return 0;
}