Cod sursa(job #1375956)

Utilizator NacuCristianCristian Nacu NacuCristian Data 5 martie 2015 15:12:33
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <vector>
#include <string.h>

using namespace std;

struct nod
{
    char inf;
    int cuv,nr_plozi;
    nod *plozi[25];
    nod(char a)
    {
        inf=a;
        nr_plozi=0;
        cuv=0;
        memset(plozi,0,sizeof(plozi));
    }


};


void adaugare(char *p,nod *x)
{
    if(p[0]=='\0')
    {
        x->cuv++;
        return;
    }

    for(int i=0;i<x->nr_plozi;i++)
        if(x->plozi[i]->inf==p[0])
        {
            adaugare(p+1,x->plozi[i]);
            return;
        }

    nod *aux=new nod(p[0]);
    x->plozi[x->nr_plozi++]=aux;
    adaugare(p+1,x->plozi[x->nr_plozi-1]);


}

void stergere(char *p,nod *x)
{
    if(p[0]=='\0')
    {
        x->cuv--;
        if(x->cuv==0 && x->nr_plozi==0)
            delete x;
        return;
    }

    for(int i=0;i<x->nr_plozi;i++)
        if(x->plozi[i]->inf==p[0] )
        {
            stergere(p+1,x->plozi[i]);
            return;
        }

}

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

    printf("0\n");

}

int prefix(char *p,nod *x)
{
    if(p[0]=='\0')
        return 0;
    for(int i=0;i<x->nr_plozi;i++)
        if(x->plozi[i]->inf==p[0] )
            return 1+prefix(p+1,x->plozi[i]);

    return strlen(p);

}




void citire()
{
    ifstream fin("trie.in");

    nod *st = new nod('\0');
    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;
}