Cod sursa(job #2788534)

Utilizator livliviLivia Magureanu livlivi Data 25 octombrie 2021 20:55:36
Problema Trie Scor 100
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 2 kb
#include <fstream>
#include <iostream>
 
const int SIGMA = 26;
 
using namespace std;
 
ifstream fin("trie.in");
ofstream fout("trie.out");
 
class Node {
public:
    int nrap, nrc;
    Node* fii[SIGMA];
 
    Node() {
        nrap = nrc = 0;
        for(int i = 0; i < SIGMA; i++)
            fii[i] = NULL;
    }
};
 
Node* trie_insert(Node* node, char* s) {
    if(node == NULL)
        node = new Node;
 
    node-> nrap++;
 
    // cout << node-> nrap << endl;
 
    if(s[0] == '\0'){
        node-> nrc++;
        // cout << node-> nrc << endl;
    }
    else {
        node-> fii[s[0] - 'a'] = trie_insert(node-> fii[s[0] - 'a'], s + 1);
        // cout << s << ' ' << node-> fii[s[0] - 'a'] << endl;
    }
 
    return node;
}
 
Node* trie_erase(Node* node, char* s) {
    node-> nrap--;
 
    if(s[0] == '\0')
        node-> nrc--;
    else
        node-> fii[s[0] - 'a'] = trie_erase(node-> fii[s[0] - 'a'], s + 1);
 
    if(node-> nrap == 0) {
        delete(node);
        node = NULL;
    }
 
    return node;
}
 
int trie_find(Node* node, char* s) {
    if(node == NULL)
        return 0;
 
    if(s[0] == '\0')
        return node-> nrc;
    else {
        // cout << s << ' ' << node-> fii[s[0] - 'a'] << endl;
        return trie_find(node-> fii[s[0] - 'a'], s + 1);
    }
}
 
int trie_prefix(Node* node, char* s) {
    if(node == NULL)
        return -1;
 
    if(s[0] == '\0')
        return 0;
    else
        return 1 + trie_prefix(node-> fii[s[0] - 'a'], s + 1);
}
 
int main()
{
    int a;
    char b[25];
    Node* trie = NULL;
    while(fin >> a) {
        // fin.get();
        fin >> b;
 
        // cout << a << ' ' << b << endl;
 
        if(a == 0)
            trie = trie_insert(trie, b);
        else if(a == 1)
            trie = trie_erase(trie, b);
        else if(a == 2)
            fout << trie_find(trie, b) <<'\n';
        else
            fout << trie_prefix(trie, b) <<'\n';
    }
 
    // b[0] = 'm'; b[1] = 'a'; b[2] = 'r'; b[3] = 'e'; b[4] = '\0';
    // cout << trie_find(trie, b) << endl;
    return 0;
}