Cod sursa(job #1828740)

Utilizator Y0da1NUME JMECHER Y0da1 Data 13 decembrie 2016 20:25:39
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

class Trie{
public:
    int cnt, fii;
    Trie *fiu[ 26 ];

    Trie()  ///constructor
    {
        cnt = 0;//nu avem cuvinte
        fii = 0;//nu este prefix
        memset(fiu,0,sizeof(fiu));
    }
};
Trie *T = new Trie;
int ins( Trie *nod, char *c )
{
    //cout<<"INSERT\n";
    if( *c == 0 )
    {
        nod->cnt++;
        return 0;
    }
    if(nod->fiu[*c-'a']==0)
    {
        nod->fiu[*c-'a'] = new Trie;
        nod->fii++;
    }
    ins(nod->fiu[*c-'a'], c+1);
    return 0;
}
int del( Trie *nod, char *c )
{
    //cout<<"DEL\n";
    if(*c==0)
        nod->cnt--;
    else if(del(nod->fiu[*c-'a'], c+1) )
        {
            nod->fiu[*c-'a'] = 0;
            nod->fii--;
        }
    if(nod->cnt==0 && nod->fii == 0 && nod != T )
    {
        delete nod;
        return 1;
    }
    return 0;
}
int aparitii(Trie *nod, char * c)
{
    //cout<<"APARITII\n";
    if(*c==0)
        return nod->cnt;
    if(nod->fiu[*c-'a'])
        return aparitii(nod->fiu[*c-'a'],c+1);
    return 0;

}
int prefix(Trie *nod, char *s, int lg)
{
//cout<<"PREFIX\n";
    if(*s == 0 || nod->fiu[*s-'a']==0)
        return lg;
    return prefix( nod->fiu[*s-'a'],s+1,lg+1);
}
int main()
{
    ifstream in ("trie.in");
    ofstream out ("trie.out");
    char cuv[32];
    int n;
    while(!in.eof())
    {
        in>>n;
        in>>cuv;
        //strcat(cuv, '\n');
        switch (n)
        {
            case 0: ins(T, cuv);
                break;
            case 1: del(T, cuv);
                break;
            case 2: out<<aparitii(T, cuv)<<"\n";
                break;
            case 3: out<<prefix(T, cuv, 0)<<"\n";
                break;
        }

    }

    return 0;
}