Cod sursa(job #1141268)

Utilizator cat_red20Vasile Ioana cat_red20 Data 12 martie 2014 19:07:51
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include<fstream>
#include<vector>
using namespace std;
struct graf
{
    graf *fiu[26];
    int nrfii,cnt;
    graf()
    {
        nrfii=0;cnt=0;
        for(int i=0;i<=25;i++)
        {
            fiu[i]=0;
        }
    }
}*g=new graf;

char s[21];
ifstream fin("trie.in");
ofstream fout("trie.out");

void insert(char *s,graf *nod)
{
    if(s[0]==0)
    {
        nod->cnt++;
        return;
    }
    if(nod->fiu[s[0]-'a']==0)
    {
        nod->fiu[s[0]-'a']=new graf;
        nod->nrfii++;
    }
    insert(s+1,nod->fiu[s[0]-'a']);
}

int deleteNode(char *s,graf *nod)
{
    if(s[0]==0)
    {
        nod->cnt--;
    }
    else
    if(deleteNode(s+1,nod->fiu[s[0]-'a'])==1)
    {
        nod->fiu[s[0]-'a']=0;
        nod->nrfii--;
    }
    if(nod->nrfii==0 && nod->cnt==0 && nod!=g)
    {
        delete nod;
        return 1;
    }
    return 0;
}

void find(char *s,graf *nod)
{
    if(s[0]==0)
    {
         fout<<nod->cnt<<"\n";
         return;
    }
    if(nod->fiu[s[0]-'a']==0)
    {
        fout<<0<<"\n";
        return;
    }
    find(s+1,nod->fiu[s[0]-'a']);
}

void prefix(char *s,graf *nod,int lvl)
{
    if(s[0]==0 || nod->fiu[s[0]-'a']==0)
    {
        fout<<lvl<<"\n";
        return;
    }
    prefix(s+1,nod->fiu[s[0]-'a'],lvl+1);
}

int main()
{

    while(!fin.eof())
    {
        fin.getline(s,25);
        switch(s[0])
        {
            case '0':insert(s+2,g);
                break;
            case '1':deleteNode(s+2,g);
                break;
            case '2':find(s+2,g);
                break;
            case '3':prefix(s+2,g,0);
        }
    }
    return 0;
}