Cod sursa(job #1211275)

Utilizator mariusn01Marius Nicoli mariusn01 Data 22 iulie 2014 12:01:24
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>

using namespace std;

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

trie *root = new trie;
ifstream fin("trie.in");
ofstream fout("trie.out");

char s[23];

int t;

void insertTrie(trie *r, char *s) {
    if (*s != 0) {
        if (r->f[*s-'a'] == 0) {
            r->f[*s-'a'] = new trie;
            r->fii++;
        }
        insertTrie(r->f[*s-'a'], s+1);
    } else
        r->nr++;
}

int deleteTrie(trie *&r, char *s) {
    if (*s == 0) {
        r->nr--;
        if (r->nr == 0 && r->fii == 0 && r!=root) {
            delete r;
            r = NULL;
            return 1;
        }
    } else {
        if (  deleteTrie( r->f[*s-'a'], s+1 ) ) {
            r->fii--;
            if (r->fii == 0 && r->nr == 0 && r!=root) {
                delete r;
                r = NULL;
                return 1;
            }
        }
    }

    return 0;
}

int queryTrie(trie *&r, char *s) {
    if (*s == 0)
        return r->nr;
    if (r->f[*s-'a'] == NULL)
        return 0;
    else
        return queryTrie(r->f[*s-'a'], s+1);

}

int prefixTrie(trie *&r, char *s) {
    if (*s == 0)
        return 0;
    if (r->f[*s-'a'] == NULL)
        return 0;
    else
        return 1 + prefixTrie(r->f[*s-'a'], s+1);

}


int main() {
    while (fin>>t>>s) {
        if (t == 0) {
            insertTrie(root, s);
        } else
            if (t == 1)
                deleteTrie(root, s);
            else
                if (t == 2)
                    fout<<queryTrie(root, s)<<"\n";
                else
                    fout<<prefixTrie(root, s)<<"\n";
    }
    return 0;
}