Cod sursa(job #890694)

Utilizator alexandrul_21Niculescu Mihai alexandrul_21 Data 25 februarie 2013 11:22:06
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 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);
}
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; }