Cod sursa(job #717592)

Utilizator deneoAdrian Craciun deneo Data 20 martie 2012 03:21:04
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <fstream>
#include <cstring>
using namespace std;

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

int n;
char sir[50];

struct Trie {
    int cnt, fii;
    Trie *fiu[26];

    Trie() {
        cnt = fii = 0;
        memset(fiu, 0, sizeof(fiu));
    }
};

Trie *t = new Trie;

void insert(Trie *nod, char cuv[50], int lc) {
    int i;
    for (i = 1; i <= lc; ++i) {
        if (nod -> fiu[cuv[i] - 'a'] == 0) {
            nod -> fii ++;
            nod -> fiu[cuv[i] - 'a'] = new Trie;
        }
        nod = nod -> fiu[cuv[i]- 'a'];
    }
    nod -> cnt ++;
}

int del(Trie *nod, char cuv[50], int poz, int lc) {
    int i;
    if (poz > lc) {
        nod -> cnt --;
    }
    else if (del(nod -> fiu[cuv[poz] - 'a'], cuv, poz + 1, lc)) {
        nod -> fii --;
        nod -> fiu[cuv[poz] - 'a'] = 0;
    }

    if (nod -> fii == 0 && nod -> cnt == 0 && nod != t) {
        delete nod; return 1;
    }
    return 0;
}

int query(Trie *nod, char cuv[50], int lc) {
    int i;
    for (i = 1; i <= lc; ++i) {
        if (nod -> fiu[cuv[i] - 'a'] == 0)
            return 0;
        nod = nod -> fiu[cuv[i] - 'a'];
    }
    return nod -> cnt;
}

int prefix(Trie *nod, char cuv[50], int lc) {
    int i;
    for (i = 1; i <= lc; ++i) {
        if (nod -> fiu[cuv[i] - 'a'] == 0)
            return i - 1;
        nod = nod -> fiu[cuv[i] - 'a'];
    }
    return i - 1;
}

int main() {
    int i, typeOP;
    fin >> typeOP; fin.get(); fin.getline(sir + 1, 40);
    while (sir[1] != '\0' && sir[1] != '\n') {
        switch (typeOP) {
        case 0: insert(t, sir, strlen(sir + 1)); break;
        case 1: del(t, sir, 1, strlen(sir + 1)); break;
        case 2: fout << query(t, sir, strlen(sir + 1)) << "\n"; break;
        case 3: fout << prefix(t, sir, strlen(sir + 1)) << "\n"; break;
        }
        fin >> typeOP; fin.get(); fin.getline(sir + 1, 40);
    }
    fout.close();
    return 0;
}