Cod sursa(job #1409825)

Utilizator ArhivaArhiva Infoarena Arhiva Data 30 martie 2015 18:49:35
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <cstdio>
using namespace std;
struct Trie
{
    Trie *son[26];
    int cnt, sons;
    Trie()
    {
        cnt = sons = 0;
        for(int i=0;i<26;++i)
            son[i] = NULL;
    }
};
Trie *T = new Trie;
int step;
inline void Add(Trie *&T,char *s)
{
    if(s[0]==0)
    {
        T->cnt++;
        return ;
    }
    int f = s[0]-'a';
    if(T->son[f] == NULL)
    {
        ++T->sons;
        T->son[f] = new Trie;
    }
    Add(T->son[f],s+1);
}
inline int Cnt(Trie *&T,char *s)
{
    if(s[0]==0)
        return T->cnt;
    if(T->son[s[0]-'a'] == 0)
        return 0;
    return Cnt(T->son[s[0]-'a'],s+1);
}
inline int Solve(Trie *&T,char *s)
{
    if(s[0] == 0)
        return 0;
    if(T->son[s[0]-'a']==0)
        return 0;
    return 1+Solve(T->son[s[0]-'a'],s+1);
}
inline bool Delete(Trie *&T,char *s)
{
    if(s[0] == 0)
    {
        --T->cnt;
        if(T->cnt == 0 && T->sons ==0){
            T = NULL;
            delete T;
            return true;
        }
        return false;
    }
    int f = s[0]-'a';
    if(Delete(T->son[f],s+1))
    {
        --T->sons;
        if(T->cnt == 0 && T->sons ==0){
            T = NULL;
            delete T;
            return true;
        }
    }
    return false;
}
char s[30];
int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    while(gets(s))
    {
        if(s[0]=='0')
            Add(T,s+2);
        else
            if(s[0]=='1')
                Delete(T,s+2);
        else
            if(s[0]=='2')
                printf("%d\n",Cnt(T,s+2));
            else
                printf("%d\n",Solve(T,s+2));
    }
    return 0;
}