Pagini recente » Cod sursa (job #315678) | Cod sursa (job #493275) | Cod sursa (job #1643671) | Cod sursa (job #3132452) | Cod sursa (job #883875)
Cod sursa(job #883875)
#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);
}
void Delete(nod *p,char s[30],int k){
int n=strlen(s);
if(k>=n){
p->nr=0;
return;
}
int ac=Convert(s[k]);
Delete(p->next[ac],s,k+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;
}