Cod sursa(job #2399814)

Utilizator CezarTDTodirisca Cezar CezarTD Data 8 aprilie 2019 02:06:16
Problema Trie Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <bits/stdc++.h>
#define CH (*c-'a')
using namespace std;

ifstream fin("trie.in");
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];

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()
{
    int op;
    while(fin>>op>>sir)
    {
        if(op==0){
            Trie *r=T;
            int l=strlen(sir);
            for(int i=0;i<l;i++)
            {
                if(r->fiu.find(sir[i])==r->fiu.end())
                {
                    r->fiu[sir[i]]=new Trie;
                    r->CntP++;
                }
                r=r->fiu[sir[i]];
            }
            r->EndW++;
        }
        if(op==1){
            del(T,0);
        }
        if(op==2){
            Trie *r=T;
            int l=strlen(sir);
            int i;
            for(i=0;i<l;i++)
            {
                if(r->fiu.find(sir[i])==r->fiu.end())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.find(sir[i])==r->fiu.end())break;
                prefix++;
                r=r->fiu[sir[i]];
            }
            fout<<prefix<<'\n';
        }
    }
}