Cod sursa(job #2399817)

Utilizator CezarTDTodirisca Cezar CezarTD Data 8 aprilie 2019 02:39:17
Problema Trie Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.54 kb
#include <bits/stdc++.h>
using namespace std;

ofstream fout("trie.out");

struct Trie{
    map<char,Trie*>fiu;
    int EndW,CntP;//final de cuvant si prefix
    Trie()
    {
        EndW=CntP=0;
    }
};

Trie *T= new Trie;
vector<pair<Trie*,char>>v;
char sir[25],linie[25];

int del(Trie *nod, int k)
{
    if(k==strlen(sir)-1)nod->EndW--;
    else{
        if(del(nod->fiu[sir[k]],k+1))
        {
            nod->fiu.erase(sir[k]);
            nod->CntP--;
        }
    }
    if(nod->CntP==0 && nod->EndW==0 && nod!=T)
    {
        delete nod;
        return 1;
    }
    return 0;

}

int main()
{
    freopen("trie.in","r",stdin);
    int op;
    fgets(linie,25,stdin);
    while(!feof(stdin))
    {
        op=int(linie[0]-'0');
        strcpy(sir,linie+2);
        if(op==0){
            Trie *r=T;
            int l=strlen(sir);
            for(int i=0;i<l;i++)
            {
                if(r->fiu.count(sir[i])==0)
                {
                    r->fiu[sir[i]]=new Trie;
                }
                r->CntP++;
                r=r->fiu[sir[i]];
            }
            r->EndW++;
        }
        if(op==1){
            //del(T,0);
            Trie *r=T,*rfiu;
            int l=strlen(sir);
            char c;
            for(int i=0;i<l;i++)
            {
                r->CntP--;
                v.push_back(make_pair(r,sir[i]));
                r=r->fiu[sir[i]];
            }
            r->EndW--;
            if(r->CntP<0)r->CntP++;
            for(int i=l-1;i>=0;i--)
            {
                tie(r,c)=v[i];
                rfiu=r->fiu[c];
                if(rfiu->EndW==0 && rfiu->CntP==0 && rfiu!=T)
                {
                    r->fiu.erase(c);
                    delete (rfiu);
                }
            }
            v.clear();
        }
        if(op==2){
            Trie *r=T;
            int l=strlen(sir);
            int i;
            for(i=0;i<l;i++)
            {
                if(r->fiu.count(sir[i])==0)break;
                r=r->fiu[sir[i]];
            }
            if(i<l)fout<<"0\n";
            else fout<<r->EndW<<'\n';
        }
        if(op==3)
        {
            int prefix=0;
            Trie *r=T;
            int l=strlen(sir);
            for(int i=0;i<l;i++)
            {
                if(r->fiu.count(sir[i])==0)break;
                prefix++;
                r=r->fiu[sir[i]];
            }
            fout<<prefix<<'\n';
        }
        fgets(linie,25,stdin);
    }
    return 0;
}