Cod sursa(job #1376605)

Utilizator NacuCristianCristian Nacu NacuCristian Data 5 martie 2015 18:01:44
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <vector>
#include <string.h>

using namespace std;

struct nod
{
    int cuv,nr_plozi;
    nod *plozi[30];
    nod()
    {
        nr_plozi=0;
        cuv=0;
        memset(plozi,0,sizeof(plozi));
    }


};


void adaugare(char *p,nod *x)
{
    int k=p[0]-'a';
    if(p[0]=='\0')
    {
        x->cuv++;
        return;
    }
    if(!x->plozi[k])
    {
        x->plozi[k]=new nod();
        x->nr_plozi++;
    }
    adaugare(p+1,x->plozi[k]);
}

void stergere(char *p,nod *&x)
{
    int k=p[0]-'a';

    if(p[1]=='\0')
    {
        if(x->plozi[k]->cuv)
           x->plozi[k]->cuv--;
        if(!x->plozi[k]->nr_plozi && !x->plozi[k]->cuv)
        {

            delete x->plozi[k];
            x->plozi[k]=NULL;
            x->nr_plozi--;
        }
        return;
    }
    stergere(p+1,x->plozi[k]);

    if(!x->plozi[k]->nr_plozi && !x->plozi[k]->cuv)
    {
        delete x->plozi[k];
            x->nr_plozi--;
    }


}

void tiparire(char *p,nod *x)
{
    int k=p[0]-'a';
    if(p[0]=='\0')
    {
        printf("%d\n",x->cuv);
        return;
    }
    if(!x->plozi[k])
    {
        printf("0\n");
        return;
    }
    tiparire(p+1,x->plozi[k]);

}

int prefix(char *p,nod *x)
{
    int k=p[0]-'a';
    if(p[0]=='\0')
        return 0;

    if(!x->plozi[k])
        return 0;

    return 1+prefix(p+1,x->plozi[k]);

}




void citire()
{
    ifstream fin("trie.in");
    nod *st = new nod();
    char s[100100];
    while(fin.getline(s,100100))
    {
        char a=s[0];
        strcpy(s,s+2);
        if(a=='0')
            adaugare(s,st);
        else if(a=='1')
            stergere(s,st);
        else if(a=='2')
            tiparire(s,st);
        else if(a=='3')
            printf("%d\n",prefix(s,st));
    }
}


int main()
{
    freopen("trie.out","w",stdout);
    citire();
    return 0;
}