Cod sursa(job #2075061)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 25 noiembrie 2017 11:11:44
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
struct nod
{
    nod *fii[27];
    int nrAparitii,nrFii;
    nod()
    {
        for(int i=0; i<27; i++)
            fii[i]=NULL;
        nrAparitii=0;
        nrFii=0;
    }
}*root,*q;
void insertCuvant(char cuv[])
{
    int l=strlen(cuv);
    q=root;
    for(int i=0; i<l; i++)
    {
        if(q->fii[cuv[i]-'a']==NULL)
        {
            q->fii[cuv[i]-'a']=new nod;
            q->nrFii++;
        }
        q=q->fii[cuv[i]-'a'];
    }
    q->nrAparitii++;
}
void deleteCuvant(char cuv[])
{
    stack <nod*> dedel;
    nod* auxdel;
    int l=strlen(cuv);
    q=root;
    for(int i=0; i<l; i++)
    {
        dedel.push(q);
        q=q->fii[cuv[i]-'a'];
    }
    q->nrAparitii--;
    auxdel=q;
    while((auxdel!=root)&&!(auxdel->nrAparitii)&&!(auxdel->nrFii))
    {
        delete auxdel;
        auxdel=dedel.top();
        dedel.pop();
        auxdel->nrFii--;
        auxdel->fii[cuv[l-1]-'a']=NULL;
        l--;
    }
}
int aparitiiCuvant(char cuv[])
{
    int l=strlen(cuv);
    q=root;
    for(int i=0; i<l; i++)
    {
        if(q->fii[cuv[i]-'a']==NULL)
            return 0;
        q=q->fii[cuv[i]-'a'];
    }
    return q->nrAparitii;
}
int prefix(char cuv[])
{
    int l=strlen(cuv),r=0;
    q=root;
    while(r<l&&q->fii[cuv[r]-'a'])
    {
        q=q->fii[cuv[r]-'a'];
        r++;
    }
    return r;
}

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;)
    {
        if(op==0)
            insertCuvant(cuv);
        if(op==1)
            deleteCuvant(cuv);
        if(op==2)
            printf("%d\n",aparitiiCuvant(cuv));
        if(op==3)
            printf("%d\n",prefix(cuv));
    }
    return 0;
}