Cod sursa(job #2282901)

Utilizator Raoul_16Raoul Bocancea Raoul_16 Data 14 noiembrie 2018 18:38:14
Problema Trie Scor 5
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
//
//  Trie.cpp
//  
//
//  Created by Raoul Bocancea on 14/11/2018.
//

#include <fstream>
#include <cstring>

#define l *lit - 'a'

const std :: string programName = "trie";
std :: ifstream f(programName + ".in");
std :: ofstream g(programName + ".out");

class Trie {
    
public:
    int nr_cuv, nr_x;
    Trie* f[26];
    Trie() {
        nr_cuv = nr_x = 0;
        memset(f, 0, sizeof f);
    }
    void insert(char* lit) {
        if (*lit) {
        
            if (!f[l]) {
                ++nr_x;
                f[l] = new Trie;
            }
            f[l]->insert(lit + 1);
        }
        else
            ++nr_cuv;
    }
    
    bool del(char* lit) {
        if (*lit)
            --nr_cuv;
        else if (f[l]->del(lit + 1)) {
            delete f[l];
            f[l] = 0;
            --nr_x;
        }
        if (nr_cuv or nr_x)
            return false;
        return true;
    }
    
    int nr_aparitii(char* lit) {
        if (*lit) {
            
            if (f[l])
                return f[l]->nr_aparitii(lit + 1);
            return 0;
        }
        return nr_cuv;
    }
    
    int dimensiune_prefix(char* lit, int size) {
        if (!*lit)
            return size;
        if (f[l])
            return f[l]->dimensiune_prefix(lit + 1, size + 1);
        return size;
    }
    
}t;

int main(void) {
    int quest;
    char s[21];
    while (f >> quest >> s)
        switch (quest) {
            case 0:
                t.insert(s);
                break;
            case 1:
                t.del(s);
                break;
            case 2:
                g << t.nr_aparitii(s) << '\n';
                break;
            case 3:
                g << t.dimensiune_prefix(s, 0) << '\n';
                break;
        }
    return 0x0;
}