Cod sursa(job #2715151)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 3 martie 2021 08:55:22
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <fstream>
#include <string>

using namespace std;

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

const int SIGMA = 26;

struct Node {
    int nrap, nrc;
    Node* children[SIGMA];

    Node() {
        nrap = nrc = 0;
        for(int i = 0; i < SIGMA; i++) {
            children[i] = NULL;
        }
    }
};

Node *trie = NULL;
string s;

Node* InsertTrie(Node* node, int index) {
    if(node == NULL) {
        node = new Node;
    }

    node-> nrap++;

    if(index == (int)s.size()) {
        node-> nrc++;
    } else {
        node-> children[s[index] - 'a'] = InsertTrie(node-> children[s[index] - 'a'], index + 1);
    }

    return node;
}

Node* DeleteTrie(Node* node, int index) {
    node-> nrap--;

    if(index == (int)s.size()) {
        node-> nrc--;
    } else {
        node-> children[s[index] - 'a'] = DeleteTrie(node-> children[s[index] - 'a'], index + 1);
    }

    if(node-> nrap == 0) {
        node = NULL;
    }

    return node;
}

int Count(Node* node, int index) {
    if(node == NULL) {
        return 0;
    }

    if(index == (int)s.size()) {
        return node-> nrc;
    }

    return Count(node-> children[s[index] - 'a'], index + 1);
}

int BestPref(Node* node, int index) {
    if(node == NULL) {
        return -1;
    }

    if(index == (int)s.size()) {
        return 0;
    }

    return 1 + BestPref(node-> children[s[index] - 'a'], index + 1);
}

int main() {
    int t;

    while(cin >> t >> s) {
        if(t == 0) {
            ///insert
            trie = InsertTrie(trie, 0);
        } else if(t == 1) {
            ///delete
            trie = DeleteTrie(trie, 0);
        } else if(t == 2) {
            ///count
            cout << Count(trie, 0) << '\n';
        } else {
            ///bestPref
            cout << BestPref(trie, 0) << '\n';
        }
    }

    return 0;
}