Cod sursa(job #2403602)

Utilizator CezarTDTodirisca Cezar CezarTD Data 11 aprilie 2019 18:47:11
Problema Trie Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <bits/stdc++.h>
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;
Trie *r,*rfiu;
Trie* v[21];
char sir[25],c;
int cnt,l;

int del(Trie *nod,int i)
{
    if(i==l)nod->EndW--;
    else{
        if(del(nod->fiu[sir[i]],i+1))
        {
            nod->lit[sir[i]-'a']=0;
            nod->CntP--;
        }
    }
    if(nod->EndW==0 && nod->CntP==0 && nod!=T)
    {
        delete nod;
        return 1;
    }
    return 0;
}


int main()
{
    int op;
    while(fin>>op)
    {
        fin>>sir;
        l=strlen(sir);
        if(op==0)
        {
            r=T;
            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)
            del(T,0);
        if(op==2)
        {
            r=T;
            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)
        {
            r=T;
            int i;
            for(i=0; i<l; i++)
            {
                if(!r->lit[int(sir[i]-'a')])
                    break;
                r=r->fiu[sir[i]];
            }
            fout<<i<<'\n';
        }

    }
    return 0;
}