Cod sursa(job #2668133)

Utilizator H7GhosTsdfgsd asdf H7GhosT Data 4 noiembrie 2020 15:32:12
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#include <bits/stdc++.h>
using namespace std;

class Node {
    public:
        Node *childs[int('z' - 'a' + 1)];
        int cnt;
        bool end;

        Node() {
            memset(this, 0, sizeof(Node));
        }
} *root = new Node;

void add(const char * word) {
    Node* node = root;
    while (*word) {
        if (node->childs[(*word) - 'a']) {
            node = node->childs[(*word) - 'a'];
        } else {
            node = (node->childs[(*word) - 'a'] = new Node);
        }
        node->cnt++;
        word++;
    }
    node->end = 1;
}

void del(const char * word) {
    Node* node = root;
    while (*word) {
        if (node->childs[(*word) - 'a']) {
            node = node->childs[(*word) - 'a'];
        } else return;
        word++;
        node->cnt--;
    }
    node->end = 0;
}

int acc(const char * word) {
    Node* node = root;
    while (*word) {
        if (node->childs[(*word) - 'a']) {
            node = node->childs[(*word) - 'a'];
        } else return 0;
        word++;
    }
    return node->end ? node->cnt : 0;
}

int len(const char * word) {
    Node* node = root;
    int cnt = 0;
    while (*word) {
        if (node->childs[(*word) - 'a'] && node->childs[(*word) - 'a']->cnt) {
            node = node->childs[(*word) - 'a'];
            cnt++;
        } else break;
        word++;
    }
    return cnt;
}
int main() {
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);

    int op;
    char word[21];
    while(scanf("%d %21s", &op, word) != EOF) {
        switch (op) {
            case 0:
                add(word); break;
            case 1:
                del(word); break;
            case 2:
                printf("%d\n", acc(word)); break;
            case 3:
                printf("%d\n", len(word)); break;
            default: break;
        };
    }
}