Cod sursa(job #1803483)

Utilizator BlackLordFMI Alex Oprea BlackLord Data 11 noiembrie 2016 15:33:54
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream fin ("trie.in");
ofstream fout ("trie.out");

struct Trie {
    int nr, nrfii;
    Trie *fiu[27];
    Trie() {
        nrfii = nr = 0;
        memset(fiu, 0, sizeof(fiu));
    }
};

const int N = 2500000;

int i, t, T, n, tip, L;
char s[N], c[30];

Trie *r=new Trie;

void baga(Trie *nod, char *p) {
    if (!(*p)) {
        ++nod -> nr;
        return;
    }
    if (nod -> fiu[*p] == NULL) {
        nod -> fiu[*p] = new Trie;
        ++nod -> nrfii;
    }
    baga(nod -> fiu[*p], p + 1);
}
int taie(Trie *nod, char *p) {
    if (!(*p)) {
        --nod -> nr;
    } else if (nod -> fiu[*p]) {
        if (taie(nod -> fiu[*p], p + 1)) {
            nod -> fiu[*p] = NULL;
            --nod->nrfii;
        }
    }
    if (!nod -> nrfii && !nod -> nr && nod != r) {
        delete nod;
        return 1;
    }
    return 0;
}

int cauta(Trie *nod,char *p) {
    if (!(*p)) {
        return nod -> nr;
    }
    if (nod -> fiu[*p]) {
        return cauta(nod -> fiu[*p], p + 1);
    }
    return 0;
}

int prefix(Trie *nod,char *p) {
    ++L;
    if (nod -> fiu[*p]) {
        return prefix(nod -> fiu[*p], p + 1);
    }
    return L - 1;
}

int main () {
    fin.get(s, N, EOF);
    n = strlen(s);
    for (i=0; i < n; ++i) {
        tip = s[i] - '0';
        i += 2;
        t =- 1;
        while (s[i] != '\n' && i < n) {
            c[++t] = s[i++] - 'a' + 1;
        }
        L = 0;
        c[++t] = 0;
        if (tip == 0) {
            baga(r, c);
        }else if (tip == 1) {
            t = taie(r, c);
        } else if (tip == 2) {
            fout << cauta(r,c) << "\n";
        } else {
            fout << prefix(r,c) << "\n";
        }
    }
    return 0;
}