Cod sursa(job #2667126)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 2 noiembrie 2020 22:00:39
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <cstdio>
#include <cstring>
using namespace std;
struct trie
{
    int cnt, nrfii;
    trie *fiu[26];
    trie()
    {
        cnt = nrfii = 0;
        memset(fiu, 0, sizeof(fiu));
    }
};
trie *T = new trie;
void addWord(trie *nod, char *s)
{
    if(*s == NULL)
    {
        nod->cnt ++;
        return;
    }
    if(nod->fiu[*s - 'a'] == 0)
    {
        nod->nrfii ++;
        nod->fiu[*s - 'a'] = new trie;
    }
    addWord(nod->fiu[*s - 'a'], s + 1);
}
int deleteWord(trie *nod, char *s)
{
    if(*s == NULL)
        nod->cnt --;
    else if(deleteWord(nod->fiu[*s - 'a'], s + 1))
    {
        nod -> fiu[*s - 'a'] = 0;
        nod->nrfii --;
    }
    if(nod->nrfii == 0 && nod->cnt == 0 && nod != T)
    {
        delete nod;
        return 1;
    }
    return 0;
}
int nrAp(trie *nod, char *s)
{
    if(*s == NULL)
        return nod->cnt;
    if(nod->fiu[*s - 'a'])
        return nrAp(nod->fiu[*s - 'a'], s + 1);
    return 0;
}
int prefix(trie *nod , char *s , int lg)
{
    if(*s == NULL || nod->fiu[*s - 'a'] == 0)
            return lg;
    return prefix(nod->fiu[*s - 'a'] , s + 1 , lg + 1);
}
int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    int op;
    char s[25];
    while(scanf("%d ", &op) != EOF)
    {
        scanf("%s\n" , s);
        if(op == 0)
            addWord(T , s);
        else if(op == 1)
            deleteWord(T , s);
        else if(op == 2)
            printf("%d\n" , nrAp(T , s));
        else
            printf("%d\n" , prefix(T , s , 0));
    }
return 0;
}