Cod sursa(job #2399838)

Utilizator CezarTDTodirisca Cezar CezarTD Data 8 aprilie 2019 09:15:19
Problema Trie Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.35 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
    bitset<26>lit;
    Trie()
    {
        EndW=CntP=0;
        lit.reset();
    }
};

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

int main()
{
    int op;
    while(fin>>op)
    {
        fin>>sir;
        if(op==0){
            Trie *r=T;
            int l=strlen(sir);
            for(int i=0;i<l;i++)
            {
                if(!r->lit[int(sir[i]-'a')])
                {
                    r->fiu[sir[i]]=new Trie;
                    r->lit[int(sir[i]-'a')]=1;
                }
                r->CntP++;
                r=r->fiu[sir[i]];
            }
            r->EndW++;
        }
        if(op==1){
            Trie *r=T,*rfiu;
            int l=strlen(sir);
            char c;
            for(int i=0;i<l;i++)
            {
                r->CntP--;
                if(r->CntP==1)v.push_back(make_pair(r,sir[i]));
                else if(r->CntP>1)
                {
                    v.clear();
                }
                r=r->fiu[sir[i]];
            }
            r->EndW--;
            int k=v.size();
            for(int i=k-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);
                    r->lit[int(c-'a')]=0;
                    delete (rfiu);
                }else break;
            }
            v.clear();
        }
        if(op==2){
            Trie *r=T;
            int l=strlen(sir);
            int i;
            for(i=0;i<l;i++)
            {
                if(!r->lit[int(sir[i]-'a')])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->lit[int(sir[i]-'a')])break;
                prefix++;
                r=r->fiu[sir[i]];
            }
            fout<<prefix<<'\n';
        }
    }
    return 0;
}