Cod sursa(job #1637542)

Utilizator Burbon13Burbon13 Burbon13 Data 7 martie 2016 17:58:13
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include <cstdio>
#include <cctype>

using namespace std;

const int lmx = 22;

struct nod {
    nod *next[27];
    int ap;
    int fn;
} *St;

int cerinta,ls;
char s[lmx];

void initializare() {
    St = new nod;
    St->ap = 0;
    St->fn = 0;
    for(int i = 1; i <= 26; ++i)
        St->next[i] = NULL;
}

void adaugare(nod *p, int l) {
    if(not isalpha(s[l+1]))
        return;
    int i = (int)s[l+1] - 96;
    if(not p->next[i]) {
        p->next[i] = new nod;
        p->next[i]->ap = 1;
        p->next[i]->fn = 0;
        for(int j = 1; j <= 26; ++j)
            p->next[i]->next[j] = NULL;
        if(s[l+2] < 'a' || s[l+2] > 'z')
            p->next[i]->fn = 1;
    } else {
        ++ p->next[i]->ap;
        if(s[l+2] < 'a' || s[l+2] > 'z')
            ++ p->next[i]->fn;
    }
    adaugare(p->next[i],l+1);

}

void stergere(nod *p, int l) {
    if(not isalpha(s[l+1]))
        return;
    int i = (int)s[l+1] - 96;
    -- p->next[i]->ap;
    if(s[l+2] < 'a' || s[l+2] > 'z')
        -- p->next[i]->fn;
    stergere(p->next[i],l+1);
}

void nr_aparitii(nod *p, int l){
    int i = (int)s[l+1] - 96;
    if(s[l+1] < 'a' || s[l+1] > 'z')
        printf("%d\n", p->fn);
    else if(p->next[i])
        nr_aparitii(p->next[i],l+1);
    else
        printf("0\n");
}

void lungime_maxima(nod *p, int l){
    int i = (int)s[l+1] - 96;
    if(s[l+1] < 'a' || s[l+1] > 'z')
        printf("%d\n", l);
    else if(p->next[i] && p->next[i]->ap)
        lungime_maxima(p->next[i],l+1);
    else
        printf("%d\n", l);
}

int main() {
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    initializare();
    while(scanf("%d", &cerinta) != -1) {
        scanf("%s", s + 1);
        if(cerinta == 0) {
            adaugare(St,0);
            continue;
        }
        if(cerinta == 1) {
            stergere(St,0);
            continue;
        }
        if(cerinta == 2) {
            nr_aparitii(St,0);
            continue;
        }
        lungime_maxima(St,0);
    }

    return 0;
}