Pagini recente » Cod sursa (job #3265113) | Cod sursa (job #1552409) | Cod sursa (job #2464685) | Cod sursa (job #1556269) | Cod sursa (job #267735)
Cod sursa(job #267735)
#include<stdio.h>
#include<time.h>
struct trie { trie *next[28]; int cont, fii;};
trie *root, *top, *paux,*coada[22];
void read(),adauga(),sterge(),contor(),prefix();
int cod,i,k[25],l,j,max;
char c[25];
int main()
{ top=new trie; top->cont=0; for(j=1;j<=26;j++) top->next[j]=0;
read();
printf("\ntime=%f sec.\n",(double)clock()/CLK_TCK);
return 0;
}
void read()
{ freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while(!(feof(stdin)))
{ scanf("%d",&cod);
scanf("%s",c);
l=0;
for(i=0;c[i]!=NULL;i++){ k[i]=(int)(c[i]-'a')+1; l++;}
if(cod==0){ adauga(); continue;}
if(cod==1){ sterge(); continue;}
if(cod==2){ contor(); continue;}
prefix();
}
}
void adauga()
{ root=top;
for(i=0;i<l;i++)
{ if(root->next[k[i]]){ root=root->next[k[i]]; continue;}
paux=new trie; paux->cont=0; paux->fii=0;
for(j=1;j<=26;j++) paux->next[j]=0;
root->next[k[i]]=paux; root->fii++;
root=paux;
}
root->cont++;
}
void sterge()
{ root=top;
for(i=0;i<l;i++){ coada[i]=root; root=root->next[k[i]];}
root->cont--;
for(i=l;i>0;i--)
{ if(root->cont) return;
if(root->fii) return;
paux=root;
root=coada[i-1]; root->next[k[i-1]]=0; root->fii--;
delete paux;
}
}
void contor()
{ root=top;
for(i=0;i<l;i++) root=root->next[k[i]];
printf("%d\n",root->cont);
}
void prefix()
{ root=top; max=0;
for(i=0;i<l;i++)
{ if(root->next[k[i]]){ root=root->next[k[i]];max++; continue;}
break;
}
printf("%d\n",max);
}