Cod sursa(job #2553637)

Utilizator ana_maria_zotaZota Ana Maria ana_maria_zota Data 22 februarie 2020 10:43:47
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;

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

struct nod{
    int nf,nrcop;
    nod *urm[25]={0};
};
nod *radacina=new nod;

char s[25];
int cerinta,l,lungime;

void adaugare(nod *&p,int poz)
{
    if(l==poz)
    {
        p->nf++;
        return;
    }
    if(p->urm[s[poz]-'a']==0)
    {
        p->urm[s[poz]-'a']=new nod;
        
    }
  p->urm[s[poz]-'a']->nrcop++;
    adaugare(p->urm[s[poz]-'a'], poz+1);
}

void stergere(nod *&p,int poz)
{
    if(poz==l)
    {
       p->nf--;
        if(p->nf==0 && p->nrcop==0)
        {
            p=0;
            delete p;
        }
        return;
    }
    p->urm[s[poz]-'a']->nrcop--;
       stergere(p->urm[s[poz]-'a'], poz+1);
       if(p->nrcop==0 && p->nf==0 && poz!=0)
       {
           p=0;
           delete p;
           
       }

}

int aparitii(nod *p,int poz)
{
    if(poz==l)
    {
        return p->nf;
         
    }
    
    if(p->urm[s[poz]-'a'])
        return aparitii(p->urm[s[poz]-'a'], poz+1);
    return 0;
}

int prefix(nod *p,int poz,int k)
{
    if(poz==l)
        return l;
     if(!p->urm[s[poz]-'a'] || p->urm[s[poz]-'a']->nrcop== 0)
           return k;
       return prefix(p->urm[s[poz]-'a'], poz+1, k+1);
}

int main( ) {
    while(fin>>cerinta>>s)
    {
        l=strlen(s);
        if(cerinta==0)
        {
            adaugare(radacina, 0);
        }
        else
            if(cerinta==1)
            {
                stergere(radacina, 0);
            }
        else
            if(cerinta==2)
            {
               fout<< aparitii(radacina, 0)<<"\n";
            }
        else
            if(cerinta==3)
            {
                fout<<prefix(radacina, 0,0)<<"\n";
                 
            }
    }
    return 0;
}