Cod sursa(job #1218231)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 10 august 2014 01:30:29
Problema Trie Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include<fstream>
#include<vector>
#include<cstring>
#define ch (*t-'a')
using namespace std;

struct cell
{
    int frecv;
    int cuv;
    cell *e[30];
    cell()
    {
        cuv=0;
        frecv=0;
        for (int i=0;i<=25;i++) e[i]=NULL;
    }
};

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

const int oo=1<<30;

int sol;
char s[30];
cell *root=new cell;

inline void ADAUGA(char *t,cell *p,int i,int len)
{
    if (p->e[ch]==NULL) p->e[ch]=new cell;
    p->e[ch]->frecv ++;
    if (i==len-1) p->e[ch]->cuv ++;
    else ADAUGA(t+1,p->e[ch],i+1,len);
}

inline bool STERGE(char *t,cell *q)
{
    if (*t==0) {
        q->frecv--;
        q->cuv --;
    }
    else
        if (STERGE(t+1,q->e[ch])==1)
            {
                if (q!=root)
                    q->frecv--;
                q->e[ch]=NULL;
            }
    if (q->frecv==0 && q->cuv==0 && q!=root) {delete q;return 1;}
    return 0;
}

inline void COUNT(char *t,cell *p,int i,int len)
{
    if (i==len)
    {
        //fout<<p->cuv<<"\n";
        sol=p->cuv;
        return ;
    }
    if (p->e[ch]==NULL)
    {
        //fout<<"caca";
        sol=0;
        return ;
    }
    COUNT(t+1,p->e[ch],i+1,len);
}

inline void PREFIX(char *t,cell *p,int i,int len)
{
    if (i==len) fout<<i<<"\n";
    else
    if (p->e[ch]==NULL) fout<<i<<"\n";
    else PREFIX(t+1,p->e[ch],i+1,len);
}

inline void SOLVE()
{
    int ok;
    while (fin>>ok)
        {
           fin>>s;
           if (!ok) ADAUGA(s,root,0,strlen(s));
           if (ok==1) STERGE(s,root);
           if (ok==2)
                {
                    sol=oo;
                    COUNT(s,root,0,strlen(s));
                    fout<<sol<<"\n";
                }
           if (ok==3) PREFIX(s,root,0,strlen(s));
        }
}

int main()
{
    SOLVE();
    return 0;
}