Cod sursa(job #1058003)

Utilizator sebinechitasebi nechita sebinechita Data 14 decembrie 2013 22:24:35
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
//nu ii frumos sa te uiti pe sursele altora:))...hotule....nu o sti face singur?:))
#include <cstring>
#include <iostream>
#include <fstream>
using namespace std;
#define sigma 30
#define el *s-'a'
ifstream fin("trie.in");
ofstream fout("trie.out");

int i;

struct Trie{
    int cnt, nr_fii;
    Trie* fii[sigma];
    Trie(){
        cnt=0;
        nr_fii=0;
        for(i=0;i<sigma;i++)
            fii[i]=0;
    }
};

Trie *t=new Trie;

void ins(Trie* nod, char* s)
{
    if(!islower(*s))
        nod->cnt++;
    else
    {
        if(nod->fii[el]==0)
        {
            nod->nr_fii++;
            nod->fii[el]=new Trie;
        }
        ins(nod->fii[el], s+1);
    }
}

int del(Trie* nod, char* s)
{
    if(!islower(*s))
        nod->cnt--;
    else if (del(nod->fii[el], s+1))
    {
        nod->fii[el]=0;
        nod->nr_fii--;
    }
    if(nod->cnt==0 && nod->nr_fii==0 && nod!=t)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int nr(Trie* nod, char* s)
{
    if(!islower(*s))
        return nod->cnt;
    if(nod->fii[el]==0)
        return 0;
    return nr(nod->fii[el], s+1);
}

int pre(Trie* nod, char* s, int k)
{
    if(!islower(*s) || nod->fii[el]==0)
        return k;
    return pre(nod->fii[el], s+1, k+1);
}

int main()
{
    char s[25];
    while(fin)
    {
        fin.getline(s, 25);
        if(!isdigit(*s))
            break;
        if(*s=='0')
            ins(t, s+2);
        else if(*s=='1')
            del(t, s+2);
        else if(*s=='2')
            fout<<nr(t, s+2)<<"\n";
        else if(*s=='3')
            fout<<pre(t, s+2, 0)<<"\n";

    }
}