Cod sursa(job #1893692)

Utilizator GoogalAbabei Daniel Googal Data 25 februarie 2017 21:48:17
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <cstring>
#define CH (*s - 'a')

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct Trie
{
    int nrc;
    int nrfii;
    Trie *fii[26];

    Trie()
    {
        nrc=nrfii=0;
        memset(fii,0,sizeof(fii));
    }
};

Trie *T= new Trie;

void adaug(Trie *p, char *s)
{
    if(*s==0)
    {
        p->nrc++;
        return;
    }

    if(p->fii[CH]==0)
    {
        p->fii[CH]=new Trie;
        p->nrfii++;
    }

    adaug(p->fii[CH],s+1);
}

int elim( Trie *p, char *s)
{
    if(*s==0)
        p->nrc--;
    else if(elim(p->fii[CH],s+1))
    {
        p->fii[CH]=0;
        p->nrfii --;
    }

    if(p->nrc==0 && p->nrfii==0 && p!=T)
    {
        delete p;
        return 1;
    }
    return 0;
}

int apar(Trie *p, char *s)
{
    if(*s==0)
        return p->nrc;
    if(p->fii[CH])
        return apar(p->fii[CH],s+1);
    return 0;
}

int prefix(Trie *p, char *s, int k)
{
    if(*s==0 || p->fii[CH]==0)
        return k;
    return prefix(p->fii[CH],s+1,k+1);
}

int main()
{
    char s[32];
    while(fin.getline(s, 31))
    {
        if(s[0]=='0')
            adaug(T,s+2);
        else if(s[0]=='1')
            elim(T,s+2);
        else if(s[0]=='2')
            fout<<apar(T,s+2)<<'\n';
        else fout<<prefix(T,s+2,0)<<'\n';
    }
    fin.close();
    fout.close();
    return 0;
}