Cod sursa(job #2488285)

Utilizator stefan_creastaStefan Creasta stefan_creasta Data 6 noiembrie 2019 17:40:51
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <cstdio>
#include <cstring>
using namespace std;
const int CUVMAX = 30;
char s[CUVMAX];
int n;
struct Trie {
    int nrfii, nrcuv;
    Trie *cuv[CUVMAX];
    Trie() {
        nrfii = nrcuv = 0;
        for(int i = 0; i <= 28; i++) {
            cuv[i] = 0;
        }
    }
};
Trie *a = new Trie;
void adauga(Trie *v, int p) {
    if(p == n + 1) {
        v->nrcuv++;
    }
    else {
        int ch = s[p] - 'a';
        if(v->cuv[ch] == 0) {
            v->nrfii++;
            v->cuv[ch] = new Trie;
        }
        adauga(v->cuv[ch], p + 1);
    }
}
bool scoate(Trie *v, int p) {
    if(p == n + 1) {
        v->nrcuv--;
    }
    else if(scoate(v->cuv[s[p] - 'a'], p + 1) == 1) {
        v->nrfii--;
        v->cuv[s[p] - 'a'] = 0;
    }
    if(v->nrfii == 0 && v->nrcuv == 0 && v != a) {
        delete v;
        return 1;
    }
    return 0;
}
int cauta(Trie *v, int p) {
    if(p == n + 1) {
        return v->nrcuv;
    }
    else if(v->cuv[s[p] - 'a'] != 0){
        return cauta(v->cuv[s[p] - 'a'], p + 1);
    }
    else {
        return 0;
    }
}
int prefix(Trie *v, int p) {
    if(p == n + 1 || v->cuv[s[p] - 'a'] == 0) {
        return p - 1;
    }
    else {
        return prefix(v->cuv[s[p] - 'a'], p + 1);
    }
}

int main() {
    int op = -1;
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    scanf("%d", &op);
    while(op != -1) {
        scanf("%s", s + 1);
        n = (int)strlen(s + 1);
        if(op == 0) {
            adauga(a, 1);
        }
        else if(op == 1) {
            scoate(a, 1);
        }
        else if(op == 2) {
            printf("%d\n", cauta(a, 1));
        }
        else {
            printf("%d\n", prefix(a, 1));
        }
        memset(s, 0, sizeof(s));
        op = -1;
        scanf("%d", &op);
    }
    return 0;
}