Pagini recente » Cod sursa (job #327772) | Cod sursa (job #409427) | Cod sursa (job #1400630) | Cod sursa (job #1144465) | Cod sursa (job #884149)
Cod sursa(job #884149)
#include <stdio.h>
#include <string.h>
struct nod{
int nr;
nod * next[30];
}*First;
int Convert(char c){
return c-'a'+1;
}
void Insert(nod *p,char s[30],int k){
int n=strlen(s);
if(k>=n){
p->nr++;
return;
}
int ac=Convert(s[k]);
if(p->next[ac]==0){
nod *q=new nod;
q->nr=0;
memset(q->next,0,sizeof(p->next));
p->next[ac]=q;
Insert(p->next[ac],s,k+1);
}
else
Insert(p->next[ac],s,k+1);
}
int IsValidDelete(nod *p){
if(p->nr>0)
return 0;
int i;
for(i=1;i<=26;i++)
if(p->next[i]!=0)
return 0;
return 1;
}
int Delete(nod *p,char s[30],int k){
int n=strlen(s);
if(k>=n){
p->nr--;
if(p->nr<0)
p->nr=0;
return p->nr;
}
int ac=Convert(s[k]);
int sw=Delete(p->next[ac],s,k+1);
if(sw<1){
nod *q=p->next[ac];
if(IsValidDelete(q)){
p->next[ac]=0;
delete q;
return p->nr;
}
}
return 1;
}
int Write(nod *p,char s[30],int k){
if(p==0)
return 0;
int n=strlen(s);
if(k>=n){
return p->nr;
}
int ac=Convert(s[k]);
return Write(p->next[ac],s,k+1);
}
int WritePrefix(nod *p,char s[30],int k){
if(p==0)
return k-1;
int n=strlen(s);
if(k>=n){
return n;
}
int ac=Convert(s[k]);
return WritePrefix(p->next[ac],s,k+1);
}
void Read(){
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
First=new nod;
First->nr=0;
memset(First->next,0,sizeof(First->next));
char s[30];
int nr;
while(!feof(stdin)){
scanf("%d %s\n",&nr,s);
if(nr==0){
Insert(First,s,0);
}
else if(nr==1){
Delete(First,s,0);
}
else if(nr==2){
printf("%d\n",Write(First,s,0));
}
else if(nr==3){
printf("%d\n",WritePrefix(First,s,0));
}
}
fclose(stdin);
fclose(stdout);
}
int main()
{
Read();
return 0;
}