Cod sursa(job #1795260)

Utilizator HuskyezTarnu Cristian Huskyez Data 2 noiembrie 2016 09:48:38
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>

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

using namespace std;

//FILE* in = freopen(infile, "r", stdin);
ifstream in(infile);
FILE* out = freopen(outfile, "w", stdout);

char w[22];
short int op;

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

    trieNode()
    {
        for(int i=0; i<=26; i++){
            tree[i] = NULL;
        }
        nrCuv = 0;
        nrSons = 0;
    }
};

trieNode *root = new trieNode;


void inserare(trieNode* node, char* w)
{
    if(*w == strlen(w)){
        node->nrCuv++;
        return;
    }
    if(node->tree[*w - 'a'] == NULL){
        node->tree[*w - 'a'] = new trieNode;
        node->nrSons++;
    }
    inserare(node->tree[*w - 'a'], w+1);
}

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

int QuerryWords(trieNode* node, char* w)
{

    if(*w == strlen(w)){
        return node->nrCuv;
    }
    if(node->tree[*w - 'a'] != NULL){
        return QuerryWords(node->tree[*w - 'a'], w+1);
    }else{
        return 0;
    }
}


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

int main()
{
    while(in>>op){
        in >> w;
        if(op == 0){
            inserare(root, w);
        }
        if(op == 1){
            delete_word(root, w);
        }
        if(op == 2){
            printf("%d\n", QuerryWords(root, w));
        }
        if(op == 3){
            printf("%d\n", QuerryPrefix(root, w));
        }
    }

    return 0;
}