Cod sursa(job #1805542)

Utilizator vladbatalanBatalan Vlad vladbatalan Data 13 noiembrie 2016 22:35:05
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
///CODUL PANA

#include<fstream>
#include<cstring>
using namespace std;
ifstream fin("in");
ofstream fout("out");

struct trie
{
    int S,C;
    trie *N[26];
    trie()
    {
        C=S=0;
        for(int i=0; i<26; i++)N[i]=0;
    }
};

trie *R,*Q,*X,*ST[30];
int x,i,j,LG;
char L[30];
int main()
{
    R=new trie;
    R->S++;
    while(fin>>x>>L)
    {
        LG=strlen(L);
        if(x==3)
        {
            for(i=0,Q=R; i<LG; i++)
            {
                if(!Q->N[L[i]-'a'])break;
                Q=Q->N[L[i]-'a'];
            }
            fout<<i<<'\n';
            continue;
        }
        if(x==2)
        {
            for(i=0,Q=R; i<LG; i++)
            {
                if(!Q->N[L[i]-'a'])break;
                Q=Q->N[L[i]-'a'];
            }
            if(i==LG)
                fout<<Q->C<<'\n';
            else
                fout<<0<<"\n";;
            continue;
        }
        for(Q=R,i=0; i<LG; i++)
        {
            ST[i]=Q;
            if(!Q->N[L[i]-'a'])Q->N[L[i]-'a']=new trie;
            Q=Q->N[L[i]-'a'];
        }
        ST[LG]=Q;
        if(!x)
        {
            for(i=0; i<LG; i++)ST[i]->S++;
            ST[LG]->C++;
            continue;
        }
        for(i=0; i<LG; i++)ST[i]->S--;
        ST[LG]->C--;
        for(i=LG-1,j=LG;; i--,j--)
        {
            if(ST[j]->C+ST[j]->S)break;
            X=ST[j];
            ST[j]=ST[i]->N[L[i]-'a']=0;
            delete X;
        }

    }
    return 0;
}