Pagini recente » Cod sursa (job #704370) | Cod sursa (job #1376690) | Cod sursa (job #2949034) | Cod sursa (job #1810460) | Cod sursa (job #890694)
Cod sursa(job #890694)
#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; }