Cod sursa(job #1379160)

Utilizator andreiblaj17Andrei Blaj andreiblaj17 Data 6 martie 2015 16:38:53
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

struct Trie {
    int nrCuvinte;
    int nrFii;
    Trie *fiu[27];
    Trie() {
        nrCuvinte = 0;
        nrFii = 0;
        for (int i = 0; i < 27; i++)
            fiu[i] = NULL;
    }
};

Trie *root = new Trie;
string s;

void adauga(int index, Trie *lista) {
    if (index == s.size()) {
        lista -> nrCuvinte++;
        return;
    }
    int letter = s[index] - 'a';
    if (lista -> fiu[letter] == NULL) {
        lista -> fiu[letter] = new Trie();
        lista -> nrFii++;
    }
    adauga(index+1, lista->fiu[letter]);
}

bool sterge(int index, Trie *lista) {
    if (index == s.size())
        lista -> nrCuvinte--;
    else {
        int letter = s[index] - 'a';
        if (sterge(index+1, lista -> fiu[letter])) {
            lista -> fiu[letter] = NULL;
            lista -> nrFii--;
        }
    }
    if (lista->nrCuvinte == 0 && lista->nrFii == 0 && lista != root) {
        delete lista;
        return 1;
    }
    return 0;
}

int nrAparitii(int index, Trie *lista) {
    if (index == s.size())
        return lista -> nrCuvinte;
    if (lista -> fiu[s[index]-'a'] == NULL)
        return 0;
    return nrAparitii(index+1, lista->fiu[s[index]-'a']);
}

int lungimePrefix(int index, Trie *lista, int x) {
    if (index == s.size() || lista -> fiu[s[index]-'a'] == NULL)
        return x;
    return lungimePrefix(index+1, lista->fiu[s[index]-'a'], x+1);
}

int main() {
    
    ifstream fin("trie.in");
    ofstream fout("trie.out");
    
    for (;getline(fin, s);) {
        switch (s[0]) {
            case '0':
                adauga(2, root);
                break;
            case '1':
                sterge(2, root);
                break;
            case '2':
                fout << nrAparitii(2, root) << "\n";
                break;
            case '3':
                fout << lungimePrefix(2, root, 0) << "\n";
                break;
                
        }
    }
    
    fin.close();
    fout.close();
    
    return 0;
}