Cod sursa(job #1963460)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 12 aprilie 2017 15:51:42
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct nod
{
    int ap,altCeva;
    nod *F[26];
    nod()
    {
        altCeva=ap=0;
        for(int i=0; i<26; i++)
            F[i]=0;
    }
};

nod *root,*q,*aux,*aux2;
int i;
int lg,l;

void insertCuv(char cuvant[])
{
    q=root;
    q->altCeva++;
    for(i=0; i<lg; i++)
    {
        if(!(q->F[*(cuvant+i)-'a']))
        {
            //q->nrFii++;
            q->F[*(cuvant+i)-'a']=new nod;
        }
        q=q->F[*(cuvant+i)-'a'];
        q->altCeva++;
        //cout<<*(cuv+i)<<" ";
    }
    //cout<<endl;
    q->ap+=1;
}

void deleteCuvant(char cuvant[])
{
    q=root;
    q->altCeva--;
    for(i=0,q=root; i<lg; i++)
    {
        aux=q;
        q=q->F[*(cuvant+i)-'a'];
        q->altCeva--;
    }

    q->ap-=1;

    /*if(q!=root&&q->ap==0&&q->nrFii==0)
    {
        aux->nrFii--;
        aux->F[*(cuvant+i-1)-'a']=NULL;
        delete q;
    }
    */
}

void aparitieCuvant(char cuvant[])
{
    for(i=0,q=root; i<lg; i++)
    {
        if(!(q->F[*(cuvant+i)-'a']))
        {
            printf("0\n");
            return;
        }
        q=q->F[*(cuvant+i)-'a'];
    }
    printf("%d\n",q->ap);
}

void prefix(char cuvant[])
{
    q=root;
    l=0;
    while(l<lg&&q->F[(*(cuvant+l)-'a')]&&q->F[(*(cuvant+l)-'a')]->altCeva)
    {
        //cout<<*(cuv+l)<<" ";
        q=q->F[(*(cuvant+l)-'a')];
        l++;
    }
    printf("%d\n",l);
}

int main()
{
    int op;
    char cuv[22];
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    root =new nod;

    for(; scanf("%d %s\n",&op,cuv)+1;)
    {
        lg=strlen(cuv);
        if(op==0)
            insertCuv(cuv);
        if(op==1)
            deleteCuvant(cuv);
        if(op==2)
            aparitieCuvant(cuv);
        if(op==3)
            prefix(cuv);
    }
    return 0;
}