Cod sursa(job #1705563)

Utilizator Harsan_SabinHarsan Sabin Harsan_Sabin Data 20 mai 2016 19:36:14
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream cin("trie.in");
ofstream cout("trie.out");

struct Trie
{
    int val,nrfii;
    Trie *fiu[26];

    Trie()
    {
        val=0;
        nrfii=0;
        for(int ind=0;ind<=25;++ind)
            fiu[ind]=0;
    }
};

Trie *T;

int i;

char j[21];

bool Insert_T(char *s,Trie *st)
{
    if(*s==0)
    {
        ++st->val;
        return 1;
    }

    if(st->fiu[*s-97]==0)
    {
        ++st->nrfii;
        st->fiu[*s-97]=new Trie;
    }

    return Insert_T(s+1,st->fiu[*s-97]);

    return 0;
}

int Delete_T(char *s,Trie *st)
{
    if(*s==0)
        --st->val;
    else
    {
        if(!Delete_T(s+1,st->fiu[*s-97]))
        {
            st->fiu[*s-97]=0;
            --st->nrfii;
        }
    }

    if(st->val==0 && st->nrfii==0 && st!=T)
    {
        delete st;
        return 0;
    }

    return 1;
}

int Find_T(char *s,Trie *st)
{
    if(*s==0)
        return st->val;

    if(st->fiu[*s-97]==0)
        return 0;

    return Find_T(s+1,st->fiu[*s-97]);

    return 0;
}

int Prefix_T(char *s,Trie *st,int rez)
{
    if(*s==0 || st->fiu[*s-97]==0)
        return rez;
    return Prefix_T(s+1,st->fiu[*s-97],rez+1);

    return 0;
}

int main()
{
    T=new Trie;

    while(cin>>i)
    {
        if(i==0)
        {
            cin.get();
            cin.get(j,22);

            Insert_T(j,T);
        }
        if(i==1)
        {
            cin.get();
            cin.get(j,22);

            Delete_T(j,T);
        }
        if(i==2)
        {
            cin.get();
            cin.get(j,22);

            cout<<Find_T(j,T)<<'\n';
        }
        if(i==3)
        {
            cin.get();
            cin.get(j,22);

            cout<<Prefix_T(j,T,0)<<'\n';
        }
    }
    return 0;
}