Cod sursa(job #1215525)

Utilizator mariusn01Marius Nicoli mariusn01 Data 1 august 2014 12:03:39
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <fstream>

using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie {
    int nr;
    int fii;
    trie *f[26];

    trie() {
        nr = fii = 0;
        for (int i=0;i<26;i++)
            f[i] = 0;
    }

};

trie *r = new trie();

void insertTrie(trie *nod, char *p) {
    if (*p == 0) {
        nod->nr++;
        return;
    }
    if (nod->f[*p-'a'] == 0)
        nod->f[*p-'a'] = new trie;
    insertTrie(nod->f[*p-'a'], p+1);
}

int deleteTrie(trie *&nod, char *p) {
    if (*p == 0) {
        nod->nr--;
        if (nod->fii == 0 && nod->nr == 0) {
            delete nod;
            nod = 0;
            return 1;
        }
        return 0;
    }

    if (deleteTrie(nod->f[*p-'a'], p+1)) {
        nod->fii--;
        if (nod->fii == 0 && nod->nr == 0 && nod != r) {
            delete nod;
            nod = 0;
            return 1;
        }
    }
    return 0;
}

int nrTrie(trie *nod, char *p) {
    if (*p == 0) {
        return nod->nr;
    }
    if (nod->f[*p-'a'] == 0)
        return 0;
    return nrTrie(nod->f[*p-'a'], p+1);
}

int prefixTrie(trie *nod, char *p) {
    if (*p == 0) {
        return 0;
    }
    if (nod->f[*p-'a'] == 0)
        return 0;
    return 1+prefixTrie(nod->f[*p-'a'], p+1);
}

char s[25];
int t;

int main() {
    while (fin>>t>>s) {
        if (t == 0) {
            // introduc s in trie
            insertTrie(r, s);
        } else
            if (t == 1) {
                deleteTrie(r, s);
            } else
                if (t == 2) {
                    fout<<nrTrie(r, s)<<"\n";
                } else
                    fout<<prefixTrie(r, s)<<"\n";
    }
    return 0;
}