Cod sursa(job #1553502)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 19 decembrie 2015 22:50:25
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include<cstdio>
#include<cstring>

using namespace std;

struct trie
{
    int sons,nr;
    trie *fiu[26];
    trie()
    {
        memset(fiu,NULL,sizeof(fiu));
        sons=0;
        nr=0;
    }
};

trie *t;
int op;
char s[23];

void adauga(char s[])
{
    int i,n;
    n=strlen(s);
    trie *x;
    x=t;
    for(i=0;i<n;i++)
    {
        if(x->fiu[s[i]-'a']==NULL)
        {
            x->sons++;
            x->fiu[s[i]-'a']=new trie;
        }
        x=x->fiu[s[i]-'a'];
    }
    x->nr++;
}

void sterge(trie *nod,char s[],int ind,int n)
{
    if(ind==n)
    {
        nod->nr--;
        return;
    }
    sterge(nod->fiu[s[ind]-'a'],s,ind+1,n);
    if(nod->fiu[s[ind]-'a']->nr==0&&nod->fiu[s[ind]-'a']->sons==0)
    {
        nod->fiu[s[ind]-'a']=NULL;
        nod->sons--;
    }
}

int aparitii(char s[])
{
    int i,n;
    n=strlen(s);
    trie *x;
    x=t;
    i=0;
    while(i<n)
    {
        x=x->fiu[s[i]-'a'];
        i++;
    }
    return x->nr;
}

int prefix(trie *nod,char s[],int ind,int n)
{
    if(ind==n||nod->fiu[s[ind]-'a']==NULL)
    {
        return ind;
    }
    return prefix(nod->fiu[s[ind]-'a'],s,ind+1,n);
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    t=new trie;
    while(gets(s))
    {
        op=s[0]-'0';
        strcpy(s,s+2);
        if(op==0)
        {
            adauga(s);
        }
        if(op==1)
        {
            sterge(t,s,0,strlen(s));
        }
        if(op==2)
        {
            printf("%d\n",aparitii(s));
        }
        if(op==3)
        {
            printf("%d\n",prefix(t,s,0,strlen(s)));
        }
    }
    return 0;
}