Cod sursa(job #1829224)

Utilizator Y0da1NUME JMECHER Y0da1 Data 14 decembrie 2016 16:52:15
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 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 == '\n' )
    {
        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=='\n')
        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=='\n')
        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 == '\n' || nod->fiu[*s-'a']==0)
        return lg;
    return prefix( nod->fiu[*s-'a'],s+1,lg+1);
}
char cuv[32];
int main()
{
    ifstream in ("trie.in");
    ofstream out ("trie.out");
    int n;
    while(!in.eof())
    {
       // in>>n;
        //in>>cuv;
        in.getline(cuv, 32);
        strcat(cuv, "\n");
        //for(int i=0;i<32;++i)
       // {
       //     cout<<cuv[i]<<" ";
        //}
        switch (cuv[0])
        {
            case '0': ins(T, cuv+2);
                break;
            case '1': del(T, cuv+2);
                break;
            case '2': out<<aparitii(T, cuv+2)<<"\n";
                break;
            case '3': out<<prefix(T, cuv+2, 0)<<"\n";
                break;
        }
        memset(cuv, 0, 32);
    }

    return 0;
}