Cod sursa(job #883875)

Utilizator alexandrul_21Niculescu Mihai alexandrul_21 Data 20 februarie 2013 14:57:58
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#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;
}