Cod sursa(job #2381159)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 16 martie 2019 10:18:11
Problema Trie Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <cstdio>
#include <string>

using namespace std;

struct trie
{
    int nr = 0, nrfii = 0;
    trie *fii[26];
    trie()
    {
        for(int i=0; i<26; ++i)
            fii[i]=NULL;
    }
}*r;

string s;

void adauga(trie *&nod, int poz)
{
    if(s[poz]=='/')
    {
        nod->nr++;
        return;
    }
    if(nod->fii[s[poz]-'a']==NULL)
        nod->fii[s[poz]-'a']=new trie(), nod->nrfii++;
    adauga(nod->fii[s[poz]-'a'], poz+1);
}

void apariti(trie *&nod, int poz)
{
    if(nod==NULL)
    {
        cout<<"0\n";
        return;
    }
    if(s[poz]=='/')
    {
        cout<<nod->nr<<"\n";
        return;
    }
    apariti(nod->fii[s[poz]-'a'],poz+1);
}

void prefix(trie *& nod, int poz)
{
    if(nod==NULL)
    {
        cout<<poz-3<<"\n";
        return;
    }
    if(s[poz]=='/')
    {
        cout<<poz-2<<"\n";
        return;
    }
    prefix(nod->fii[s[poz]-'a'],poz+1);
}

bool stergere(trie *& nod, int poz)
{
    if(s[poz]=='/')
    {
        nod->nr--;
    }
    else{
        if(stergere(nod->fii[s[poz]-'a'],poz+1)){
            nod->fii[s[poz]-'a']=NULL;
            nod->nrfii --;
        }
    }
    if(nod->nr == 0 && nod->nrfii==0 && nod!=r)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    r=new trie();

    ios::sync_with_stdio(false);

    while(!cin.eof())
    {
        getline(cin,s);
        s+='/';
        if(s[0]=='0')
            adauga(r,2);
        else if(s[0]=='1')
            stergere(r,2);
        else if(s[0]=='2')
            apariti(r,2);
        else if(s[0]=='3')
            prefix(r,2);
    }

    return 0;
}