Cod sursa(job #1795190)

Utilizator HuskyezTarnu Cristian Huskyez Data 2 noiembrie 2016 08:07:03
Problema Trie Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 2.09 kb
#include <iostream>
#include <fstream>
#include <cstring>

#define infile "trie.in"
#define outfile "trie.out"

using namespace std;

ifstream in(infile);
ofstream out(outfile);

string w;
short int op;

struct trieNode{
    trieNode* tree[26];
    int nrCuv;
    int nrSons;

    trieNode()
    {
        memset(tree, NULL, sizeof(tree));
        nrCuv = 0;
        nrSons = 0;
    }
};

trieNode *root = new trieNode;


void inserare(trieNode *node, string w)
{
    for(int nrCar = 0; nrCar != w.size(); nrCar++){
        if(node->tree[w[nrCar] - 'a'] == NULL){
            trieNode* n = new trieNode;
            node->tree[w[nrCar] - 'a'] = n;
        }
        node->nrSons++;
        node = node->tree[w[nrCar] - 'a'];
    }
    node->nrCuv++;
}

bool delete_word(trieNode *node, string w, int nrCar=0)
{
    if(nrCar == w.size()){
        node->nrCuv--;
    }else{
        if(delete_word(node->tree[w[nrCar] - 'a'], w, nrCar+1)){
            node->nrSons--;
            node->tree[w[nrCar] - 'a'] = NULL;
        }
    }
    if(!node->nrCuv and !node->nrSons and node != root){
        delete node;
        return true;
    }
    return false;
}

int QuerryWords(trieNode* node, string w, int nrCar=0)
{
    if(nrCar == w.size()){
        return node->nrCuv;
    }
    if(node->tree[w[nrCar] - 'a'] != NULL){
        return QuerryWords(node->tree[w[nrCar] - 'a'], w, nrCar+1);
    }else{
        return 0;
    }
}


int QuerryPrefix(trieNode* node, string w, int nrCar=0, int maxSons = 0)
{
    if(nrCar == w.size() or node->tree[w[nrCar] - 'a'] == NULL){
        return maxSons;
    }else{
        return QuerryPrefix(node->tree[w[nrCar] - 'a'], w, nrCar+1, maxSons+1);
    }
}

int main()
{
    while(in >> op >> w){
        if(op == 0){
            inserare(root, w);
        }
        if(op == 1){
            delete_word(root, w);
        }
        if(op == 2){
            out << QuerryWords(root, w) << '\n';
        }
        if(op == 3){
            out << QuerryPrefix(root, w) << '\n';
        }
    }

    return 0;
}