Cod sursa(job #2403627)

Utilizator CezarTDTodirisca Cezar CezarTD Data 11 aprilie 2019 19:01:04
Problema Trie Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.42 kb
#include <bits/stdc++.h>

#define CH (*c-'a')

using namespace std;



ifstream fin("trie.in");

ofstream fout("trie.out");



struct Trie{

    unordered_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;

pair<Trie*,char>v[21];

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;

            int cnt=0;

            for(int i=0;i<l;i++)

            {

                r->CntP--;

                v[++cnt]=make_pair(r,sir[i]);

                r=r->fiu[sir[i]];

            }

            r->EndW--;

            for(int i=cnt;i>=1;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;

            }

            memset(v,0,sizeof(v));

        }

        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;

}