Cod sursa(job #2002569)

Utilizator caesar2001Stoica Alexandru caesar2001 Data 20 iulie 2017 12:13:26
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <cstdio>

using namespace std;

const int nmax = 20;

char v[nmax+3];

int nr;

struct trie{
    trie* next[26];
    int apcuvant;
    int subarbore;
    trie()
    {
        for(int i = 0;i <= 25;i ++)
        {
            next[i] = NULL;
        }
        apcuvant = 0;
        subarbore = 0;
    }
};

trie *rad = NULL;

trie* adauga(char v[], trie *act)
{
    if(act == NULL)
        act = new trie;
    act -> subarbore ++;
    if(v[0] >= 'a' && v[0] <= 'z')
    {
        act -> next[v[0] - 'a'] = adauga(v+1, act -> next[v[0] - 'a']);
    }
    else
    {
        act -> apcuvant ++;
    }
    return act;
}

trie* sterge(char v[], trie *act)
{
    act -> subarbore --;
    if(v[0] >= 'a' && v[0] <= 'z')
        act -> next[v[0] - 'a'] = sterge(v+1,act -> next[v[0] - 'a']);
    else
    {
        act -> apcuvant --;
    }
    if(act -> subarbore == 0)
    {
        delete act;
        return NULL;
    }
    else
    {
        return act;
    }

}

int print(char v[], trie *act)
{
    if(act == NULL)
        return 0;
    if(v[0] < 'a' || v[0] > 'z')
        return act -> apcuvant;
    else    {
        return print(v+1,act -> next[v[0] - 'a']);
    }

}
int prefix(char v[], trie *act)
{
    if(act == NULL)
    {
        return nr-1;
    }
    if(act -> subarbore <= 1)
        return nr;
    if(v[0] >= 'a' && v[0] <= 'z'){
        nr ++;
        return prefix(v+1,act -> next[v[0] - 'a']);
    }

}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    int t;
    while(scanf("%d %s",&t,&v) != EOF)
    {
        if(t == 0)
            rad = adauga(v,rad);
        if(t == 1)
            rad = sterge(v,rad);
        if(t == 2)
            printf("%d\n",print(v,rad));
        if(t == 3){
            printf("%d\n",prefix(v,rad));
            nr = 0;
        }

    }

    return 0;
}