Cod sursa(job #1961250)

Utilizator andreeagoideaAndreea Goidea andreeagoidea Data 10 aprilie 2017 23:24:57
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <cstdio>
#include <iostream>

using namespace std;

struct nod
{
    int prefix,aparitii;
    nod *nxt[26];
    nod()
    {
        prefix=0;
        aparitii=0;
        for(int i=0; i<26; i++)
            nxt[i]=NULL;
    }
} *rad;

char cuv[30];

nod *insert(nod *act, char v[])
{
    if(act==NULL) act=new nod;
    act->prefix++;
    if(v[0]==0)
    {
        act->aparitii++;
        return act;
    }
    act->nxt[ v[0]-'a' ] = insert(act->nxt[ v[0]-'a' ],v+1);
    return act;
}

nod *erase(nod *act, char v[])
{
    act->prefix--;
    if(v[0]==0)
    {
        act->aparitii--;
        if(act->aparitii==0 && act->prefix==0)
        {
            delete act;
            act=NULL;
        }
        return act;
    }
    act->nxt[v[0]-'a'] = erase(act->nxt[v[0]-'a'], v+1);
    if(act->prefix==0)
    {
        delete act;
        act=NULL;
    }
    return act;
}

int search(nod *act, char v[])
{
    if(act==NULL) return 0;
    if(v[0]==0) return act->aparitii;
    return search(act->nxt[v[0]-'a'], v+1);
}

int pref( nod * act, char v[]){
    if(act==NULL) return -1;
    if(v[0]==0) return 0;
    int val=pref(act->nxt[v[0]-'a'], v+1);
    return 1+val;
}

int main()
{
    ios_base::sync_with_stdio(false);
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    int t;
    while(scanf("%d ",&t)==1)
    {
        gets(cuv);
        if(t==0) rad=insert(rad,cuv);
        if(t==1) rad=erase(rad,cuv);
        if(t==2) printf("%d\n",search(rad,cuv));
        if(t==3) printf("%d\n",pref(rad,cuv));
    }
}