Cod sursa(job #2361312)

Utilizator SemetgTemes George Semetg Data 2 martie 2019 14:29:00
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#include <cstring>
using namespace std;

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

struct Node {
    int cnt, noSons;
    Node* sons[26];
    
    Node() {
        cnt = 0;
        noSons = 0;
        memset(sons, 0, sizeof(sons));
    }
};

Node* T = new Node;

void insert(Node* node, char* s) {
    if (!*s) {
        ++node->cnt;
        return;
    }
    
    if (!node->sons[*s - 'a']) {
        node->sons[*s - 'a'] = new Node;
        ++node->noSons;
    }
    
    insert(node->sons[*s - 'a'], s + 1);
}

int erase(Node* node, char* s) {
    if (!*s) {
        --node->cnt;
    } else if (erase(node->sons[*s - 'a'], s + 1)) {
        node->sons[*s - 'a'] = NULL;
        --node->noSons;
    }
    
    if (!node->cnt && !node->noSons && node != T) {
        delete node;
        return 1;
    }
    
    return 0;
}

int queryCnt(Node* node, char* s) {
    if (!*s)
        return node->cnt;
    if (node->sons[*s - 'a'])
        return queryCnt(node->sons[*s - 'a'], s + 1);
    
    return 0;
}

int queryPrefix(Node* node, char* s, int level) {
    if (!*s || !node->sons[*s - 'a'])
        return level;
    
    return queryPrefix(node->sons[*s - 'a'], s + 1, level + 1);
}

int main() {
    char line[35];
    
    while (in.getline(line, 35)) {
        if (line[0] == '0')
            insert(T, line + 2);
        else if (line[0] == '1')
            erase(T, line + 2);
        else if (line[0] == '2')
            out << queryCnt(T, line + 2) << '\n';
        else
            out << queryPrefix(T, line + 2, 0) << '\n';
    }
}