Pagini recente » Cod sursa (job #2543557) | Cod sursa (job #2394317) | Cod sursa (job #381178) | Cod sursa (job #2547993) | Cod sursa (job #267996)
Cod sursa(job #267996)
#include<stdio.h>
#include<string.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];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++)
{ if(!root->next[k[i]]){ printf("0\n"); return;}
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);
}