Cod sursa(job #1573219)

Utilizator andreeainfo_dAndreea Dutulescu andreeainfo_d Data 19 ianuarie 2016 15:18:06
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>
#include <cstring>
int op,n;
struct trie
{
    int cuvinte, prefixe;
    trie *lit[26];
    trie()
    {
        cuvinte=prefixe=0;
        memset(lit, 0, sizeof(lit));
    }
} *andr;
char s[23];
void adaug_cuv()
{
    trie *q = andr;
    andr->prefixe ++;
    for(int i=0;i<n;i++)
    {
        if(q->lit[s[i]]==0) q->lit[s[i]]=new trie;
        q=q->lit[s[i]];
        q->prefixe++;
    }
    q->cuvinte++;
    return;
}

void sterg_cuv()
{
    trie *q = andr;
    andr->prefixe --;
    for(int i=0;i<n;i++)
    {
        q=q->lit[s[i]];
        q->prefixe --;
    }
    q->cuvinte--;
    return;
}

int numar_cuv()
{
    trie *q = andr;
    for(int i=0;i<n;i++)
    {
        if (q->lit[s[i]] == 0) return 0;
        q=q->lit[s[i]];
    }
    return q->cuvinte;
}

int numar_pre()
{
    trie *q = andr;
    for(int i=0;i<n;i++)
    {
        if(q->lit[s[i]]==0 || q->lit[s[i]]->prefixe == 0) return i;
        q=q->lit[s[i]];
    }
    return n;
}
int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    andr = new trie;
    while(1)
    {
        op=-1;
        scanf("%d %s",&op,&s);
        n=strlen(s);
        for (int i=0;i<n;i++)
            s[i]-='a';
        if(op==-1)break;

        if(op==0)adaug_cuv();
        if(op==1)sterg_cuv();
        if(op==2)printf("%d\n",numar_cuv());
        if(op==3)printf("%d\n",numar_pre());
    }
    return 0;
}