Cod sursa(job #1144681)

Utilizator alex_bucevschiBucevschi Alexandru alex_bucevschi Data 17 martie 2014 13:58:12
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <cstdio>

using namespace std;
struct trie
{
    trie *urm[26];
    int cnt;
    int pas;
    trie()
    {
        for(int i=0;i<26;i++)urm[i]=0;
        cnt=0;
        pas=0;
    }
};
trie *root,*pt,*aux;
char w[25],*pc;
int cod,i;
void add(),elim(),count(),lung();
int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    root=new trie;
    for(;scanf("%d",&cod)+1;)
    {
        scanf("%s",w);
        if(cod==0)add();
        if(cod==1)elim();
        if(cod==2)count();
        if(cod==3)lung();

    }
    return 0;
}
void add()
{
    for(pt=root,pc=w;*pc;pc++)
    {
        i=*pc-'a';
        if(!pt->urm[i])
        {
            aux=new trie;
            pt->urm[i]=aux;
        }
        pt=pt->urm[i];
        pt->pas++;
    }
    pt->cnt++;
}
void elim()
{
    for(pt=root,pc=w;*pc;pc++)
    {
        i=*pc-'a';pt=pt->urm[i];pt->pas--;
    }
    pt->cnt--;//pt->pas--;
}
void count()
{
    for(pt=root,pc=w;*pc;pc++)
    {
        i=*pc-'a';
        if(!pt->urm[i])
        {
            printf("0\n");
            return;
        }
        pt=pt->urm[i];
        if(pt->pas==0)
        {
            printf("0\n");
            return;
        }

    }
    printf("%d\n",pt->cnt);
}
void lung()
{
    int lg=0;
    for(pt=root,pc=w;*pc;pc++)
    {
        i=*pc-'a';
        if(!pt->urm[i])
        {
            printf("%d\n",lg);
            return;
        }
        pt=pt->urm[i];
        if(pt->pas==0)
        {
            printf("%d\n",lg);
            return;
        }
        lg++;
    }
    printf("%d\n",lg);
}