Cod sursa(job #1768854)

Utilizator caprariuapCaprariu Alin-Paul caprariuap Data 1 octombrie 2016 16:01:49
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <cstdio>
#include <fstream>

using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct nod
{
    nod *next[30];
    int sf,nrfii;
    nod()
    {
        sf=0;
        nrfii=0;
        for(int i=0; i<27; i++)
            next[i]=0;
    }
}rad;

void ins(char *w)
{
    int ind=0;
    nod *p=&rad;
    while (w[ind]!='\0')
    {
        if (p->next[w[ind]-'a']==NULL)
        {
            nod *n=new nod;
            p->next[w[ind]-'a']=n;
        }
        p->nrfii++;
        p=p->next[w[ind]-'a'];
        ind++;
    }
    p->sf++;
}

bool sterge(char *w,nod *p)
{
    if(w[1]==0)
    {
        p->sf--;
        if(p->sf==0&&p->nrfii==0) return 1;
        return 0;
    }
    bool ok=sterge(w+1,p->next[w[0]-'a']);
    if (ok==1)
    {
        delete p->next[w[0]-'a'];
        p->next[w[0]-'a']=0;

        if(p->nrfii==1)
            return 1;
        p->nrfii--;
        return 0;
    }
    else
    {
        p->nrfii--;
        return 0;
    }
}

int cautare(char *w)
{
    int ind=0;
    nod *p=&rad;
    while (w[ind]!=0)
        if (p->next[w[ind]-'a'])
            p=p->next[w[ind++]-'a'];
        else return 0;
    return p->sf;
}

int prefix(char *w)
{
    int ind=0,nr=0;
    nod *p=&rad;
    while (w[ind]!=0)
        if (p->next[w[ind]-'a'])
            p=p->next[w[ind++]-'a'],nr++;
        else return nr;
    return nr;
}

int main()
{
    int op;
    char w[25];
    fin>>op>>w;
    int IND=1;
    while (fin>>op>>w)
    {
        if (op==0)
            ins(w);
        else if (op==1)
            sterge(w,&rad);
        else if (op==2)
            fout<<cautare(w)<<'\n';
        else if (op==3) fout<<prefix(w)<<'\n';
        op=-1;
        IND++;
    }
    return 0;
}