Cod sursa(job #2403053)

Utilizator CezarTDTodirisca Cezar CezarTD Data 11 aprilie 2019 11:15:38
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.23 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;
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;
}