Cod sursa(job #845053)

Utilizator dariusdariusMarian Darius dariusdarius Data 30 decembrie 2012 13:32:11
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<stdio.h>
#include<string.h>
struct Trie
{
    int nr,nf;
    Trie *f[26];
    
    Trie() {nr=nf=0;memset(f,0,sizeof(f));}
};
Trie *root=new Trie;
void add(Trie *T,char *s)
{
    if(*s==0) T->nr++;
    else
        if(T->f[*s-'a']==0)
        {
            T->f[*s-'a']=new Trie;
            T->nf++;
            add(T->f[*s-'a'],s+1);
        }
        else
            add(T->f[*s-'a'],s+1);
}
int query(Trie *T,char *s)
{
    if(*s==0) return T->nr;
    else
        if(T->f[*s-'a'])
            return query(T->f[*s-'a'],s+1);
    return 0;
}
int del(Trie *T,char *s)
{
    if(*s==0) T->nr--;
    else
        if(del(T->f[*s-'a'],s+1))
        {
            T->f[*s-'a']=0;
            T->nf--;
        }
    if(T->nr==0 && T->nf==0) {delete T;return 1;}
    return 0;
}
int solve(Trie *T,char *s)
{
    if(*s==0 || T->f[*s-'a']==0) return 0;
    else
        return 1+solve(T->f[*s-'a'],s+1);
}
int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    char s[32];
    while(gets(s))
    {
        if(s[0]=='0') add(root,s+2);
        else if(s[0]=='1') del(root,s+2);
        else if(s[0]=='2') printf("%d\n",query(root,s+2));
        else printf("%d\n",solve(root,s+2));
    }
    return 0;
}