Cod sursa(job #2403134)

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

ifstream fin("trie.in");
ofstream fout("trie.out");

struct Trie{
    Trie* fiu[26];
    int EndW,CntP;//final de cuvant si prefix
    Trie()
    {
        EndW=CntP=0;
        for(int i=0;i<26;i++)fiu[i]=NULL;
    }
};

Trie *T= new Trie;
Trie *r,*rfiu;
Trie* v[21];
char sir[25],c;
int cnt;

int main()
{
    int op;
    while(fin>>op)
    {
        fin>>sir;
        if(op==0){
            r=T;
            int l=strlen(sir);
            for(int i=0;i<l;i++)
            {
                if(!r->fiu[int(sir[i]-'a')])
                {
                    r->fiu[sir[i]-'a']=new Trie;
                }
                r->CntP++;
                r=r->fiu[sir[i]-'a'];
            }
            r->EndW++;
        }
        if(op==1){
            r=T;
            int i,l=strlen(sir);
            for(i=0;i<l;i++)
            {
                r->CntP--;
                v[i]=r;
                r=r->fiu[sir[i]-'a'];
            }
            r->EndW--;
            v[i]=r;
            for(int j=l,i=l-1;;i--,j--)
            {
                if(v[j]->EndW!=0 || v[j]->CntP!=0 || v[j]==T)break;
                r=v[j];
                v[i]->fiu[sir[i]-'a']=NULL;
                delete r;
            }
            memset(v,0,sizeof(v));
        }
        if(op==2){
            r=T;
            int l=strlen(sir);
            int i;
            for(i=0;i<l;i++)
            {
                if(!r->fiu[int(sir[i]-'a')])break;
                r=r->fiu[sir[i]-'a'];
            }
            if(i<l)fout<<"0\n";
            else fout<<r->EndW<<'\n';
        }
        if(op==3)
        {
            r=T;
            int i,l=strlen(sir);
            for(i=0;i<l;i++)
            {
                if(!r->fiu[int(sir[i]-'a')])break;
                r=r->fiu[sir[i]-'a'];
            }
            fout<<i<<'\n';
        }
    }
    return 0;
}