Cod sursa(job #1248491)

Utilizator UMihneaUngureanu Mihnea UMihnea Data 25 octombrie 2014 12:43:00
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct nod
{
    int ap,cnt;
    nod *urm[26];
    nod()
    {
        ap=0;
        cnt=0;
        for(int i=0;i<26;i++)urm[i]=NULL;
    }
};
nod *root,*pt,*aux,*S[25];
int c,k,X[25];
char s[25],*ps;
int main()
{
    root=new nod;root->cnt=1;
    while(fin>>c)
    {
        fin>>s;
        if(c==0)
        {
            for(pt=root,ps=s;*ps;ps++)
            {
                k=*ps-'a';
                if(!pt->urm[k]){aux=new nod;pt->urm[k]=aux;}
                pt=pt->urm[k];
                pt->cnt++;

            }
            pt->ap++;
            continue;
        }
        if(c==1)
        {
            S[0]=root;
            int LG=0;
            for(pt=root,ps=s;*ps;ps++)
            {
                k=*ps-'a';
                pt=pt->urm[k];X[LG++]=k;S[LG]=pt;
                pt->cnt--;

            }
            pt->ap--;
            for(int i=LG-1;i>=0;i--)
                if(S[i+1]->cnt==0)
                {
                    S[i]->urm[X[i]]=NULL;
                    delete S[i+1];
                }

            continue;
        }
        if(c==2)
        {
            for(pt=root,ps=s;*ps;ps++)
            {
                k=*ps-'a';
                if(!pt->urm[k])
                    break;
                pt=pt->urm[k];
            }
            if(*ps==0)fout<<pt->ap<<'\n';
            else fout<<"0\n";
            continue;
        }
        if(c==3)
        {
            int LG=0;
            for(pt=root,ps=s;*ps;ps++)
            {
                k=*ps-'a';
                if(!pt->urm[k])break;
                pt=pt->urm[k];LG++;
            }
            fout<<LG<<'\n';
        }


    }
    return 0;
}